IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Obtention d'un résultat incorrect suite à un SUM


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Angelik
    Profil pro
    Inscrit en
    Août 2006
    Messages
    253
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 253
    Par défaut Obtention d'un résultat incorrect suite à un SUM
    Bonjour tout le monde !

    J'ai 3 tables que je souhaiterais joindre, respectivement membre, parrain, commande

    ci-dessous :

    table 'membre'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    CREATE TABLE `membre` (
      `id` int(11) NOT NULL,
      `pseudo` varchar(80) NOT NULL,
      `pass_md5` text NOT NULL,
      `nom` varchar(80) NOT NULL default '',
      `prenom` varchar(80) NOT NULL default '',
      `adresse` text NOT NULL,
      `cp` text NOT NULL,
      `ville` text NOT NULL,
      `email` varchar(80) NOT NULL default '',
      `valide` varchar(4) NOT NULL,
      `newsletter` varchar(4) NOT NULL,
      `date` datetime NOT NULL default '0000-00-00 00:00:00',
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM;
    table 'parrain'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    CREATE TABLE `parrain` (
      `id` int(11) NOT NULL auto_increment,
      `parrain` varchar(80) NOT NULL default '',
      `filleul` varchar(80) NOT NULL,
      `valide` varchar(4) NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM;
    et table 'commande'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    CREATE TABLE `commande` (
      `id` int(11) NOT NULL auto_increment,
      `amount` varchar(11) NOT NULL default '',
      `membre` varchar(80) NOT NULL default '',
      `nom` varchar(80) NOT NULL default '',
      `adresse` varchar(120) NOT NULL default '',
      `cp` varchar(12) NOT NULL default '',
      `ville` varchar(80) NOT NULL default '',
      `tel` varchar(40) NOT NULL default '',
      `email` varchar(80) NOT NULL default '',
      `comments` text NOT NULL,
      `active` varchar(4) NOT NULL default '',
      `date` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
     
     
    ) ENGINE=MyISAM;
    Dès lors je souhaiterais obtenir le [1] nombre de filleuls par membre à partir de la table 'parrain' où parrain.parrain = membre.pseudo et le [2] total des gains versés pour chaque membre à partir de la table 'commande' où commande.membre = membre.pseudo

    jusque là tout me paraît clair ...

    De ce fait, voici ma requête pour afficher [1] et [2] avec une triple jointure telle que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
     
    $select = mysql_query("SELECT membre.id,
    .pseudo,membre.nom,membre.prenom,membre.adresse,membre.cp,membre.ville,membre.email,membre.date,parrain.parrain,parrain.valide,commande.valide, count(*) AS nombre, sum(commande.amount) AS somme FROM membre
     
    			  LEFT JOIN parrain ON membre.pseudo = parrain.parrain
     
    			  LEFT JOIN commande ON commande.membre = membre.pseudo
     
     
     
    			 GROUP BY membre.pseudo 
    			 ORDER BY nombre desc") 
    			 or exit(mysql_error() . "<br/>$select");
     
    	$row = mysql_query($select);
            $nombre = $row['nombre'];
    	$somme = $row['somme'];
     
    while($row = mysql_fetch_assoc($select)) 
    	{
     
    	$fi_to = 0;
    	$so_to = 0;
     
            $fi= $row['nombre'];
            $so= $row['somme'];
     
            $fi_to += $fi;
            $so_to += $so;
     
    echo' membre == ".$row['pseudo']." ';
    echo'<br>';
    echo' Gains totaux == ".$so_to." ';
    echo'<br>';
    echo' filleuls == ".$fi_to." ';
    echo' <br>';
     
    }
    Le problème ? .. et là ça se complique ...

    Dès que le total des enregistrements à additionner pour obtenir les gains totaux par membre dans la table 'commande' est supérieur à 2, les résultats sont faussés.

    Exemple avec les enregistrements du membre Suzanne :

    table 'commande'

    membre | amount |

    suzanne | 1100|
    suzanne | 800 |
    brigitte | 2000 |
    Suzanne | 400 |

    Ma requête devrait me retourner 2300 (1100+800+400) mais au lieu de cela, elle multiplie le résultat par je ne sais quelle nombre (sûrement logique) et multiplie dès lors le nombre de filleuls par membre (ici ceux de suzanne) par le nombre des enregistrements de suzanne dans la table 'commande' ( Dans l'exemple ci-dessus : 3)

    Au lieu de m'afficher distinctement le nombre de filleuls et les gains totaux perçus ... Pour faire simple ça merde !

    Merci de votre aide et de l'attention que vous porterez à ce post ++

  2. #2
    Membre émérite
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Par défaut
    bon, j'ai lu ton probleme en diagonale (il se fait tard), mais ça ressemble au cas classique ou l'on compte plusieur fois les meme valeurs... Donc désolé si je suis a coté de la plaque...

    Je m'explique : imagine les tables entreprise et employe, avec entreprise qui contient un champs 'nb_salaries' qui contient le nombre d'empoyés (on passera sur le fait que c'est pas censé se faire puisque c'est une donnée calculée).

    Si tu fait une requete du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from entreprise, employe where employe.entreprise = entreprise.id;
    Cette requete sortira autant d'enregistrement qu'il y a d'employé dans la base de données, et chaque ligne contiendra les info employés + info entreprise.

    De la sorte, en faisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select sum(entreprise.nb_employe) from entreprise, employe where employe.entreprise = entreprise.id;
    additionnera autant de fois la valeur entreprise.nb_employe qu'il y a d'employés, puisque cette valeur ressort à chaque ligne retournée...

    Ainsi, si on imagine une seule entreprise dans ta base avec 3 salaries reliés a cette entreprise dans la table salarié, en tapant la requet précédante, tu obtiendra 9 ! Pour avoir le nombre de salariés, il aurait fallu faire count(salarie.id).

    Je pense que tu as le meme probleme...

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2005
    Messages : 774
    Par défaut
    dans le schema de tes tables, nul part je ne vois de foreign key. Je me demande si le fait que les tables ne soient pas relié par ce genre de contrainte n'est pas cause de ton faux resultat

  4. #4
    Membre expérimenté
    Homme Profil pro
    Programmeur Delphi
    Inscrit en
    Octobre 2006
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Programmeur Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 183
    Par défaut
    Slt

    un conseil au niveau de ta requête
    au lieu d'utiliser les "left join"

    créer ta jointure au niveau de ta condition where tab1.id = tab2.id

  5. #5
    Membre éclairé Avatar de Angelik
    Profil pro
    Inscrit en
    Août 2006
    Messages
    253
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 253
    Par défaut
    Coucou tout le monde,

    Je pense avoir saisi (du bout du doigt néanmoins) ton exemple Gloubi mais dans mon cas, je cherche à additionner les gains de chaque membre enregistrer de ma table 'commande' où commande.membre = membre.pseudo (d'où le SUM) et non retourner le nombre d'enregistrements (ce que je fais en l'occurrence pour le nombre de filleuls avec le COUNT)

    J'avoue, je suis un peu perdue ...

    Concernant les jointures, il semble effectivement que je me sois pris la tête pour rien avec les LEFT JOIN ...

    Merci de votre patience ...

  6. #6
    Membre chevronné Avatar de papyphp
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    438
    Détails du profil
    Informations personnelles :
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 438
    Par défaut
    Bonjour angelik,

    A première vue tu cherches à faire deux choses totalement différentes dans la même requête : le nombre de filleuls et la somme des gains
    le problème est que, si j'ai bien vu, pour chaque filleul trouvé tu auras tous les enregistrements de gains et donc la somme devrait être mulitipliée par le nombre de filleuls.

    Porquoi ne procèderais-tu pas en deux étapes
    1) le nombre de filleuls
    Tu ranges ce nombre dans un tableau multiple $membre[pseudo) = array('filleuls' => nombre_de_filleuls, 'gains' => montant_des_gains)
    2) la somme des gains que tu ranges dans ce même tableau.
    Il ne te restes plus qu'a balayer le tableau avec un foreach pour faire ton affichage

    A bientôt

Discussions similaires

  1. Résultats incorrects d'une vue
    Par Njoannides dans le forum Requêtes
    Réponses: 1
    Dernier message: 01/07/2009, 22h12
  2. fonction fileperms() résultat incorrect
    Par mikeduff dans le forum Langage
    Réponses: 1
    Dernier message: 06/03/2009, 14h02
  3. Réponses: 2
    Dernier message: 14/04/2008, 10h13
  4. Problème de calcul : Résultat incorrect.
    Par Nico-xs dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 25/10/2006, 13h10
  5. [MySQL] Afficher le résultat de la fonction SUM()
    Par Flushovsky dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 23/12/2005, 01h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo