Bonjour à tous !
Je me permets de poster ce topic suite à un problème d'addition (sum) ... grr
J'ai 3 tables (nommons-les table_membre, table1 et table2) dont voici les structures, ci-dessous :
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 -- -- Structure de la table `table_membre` -- CREATE TABLE IF NOT EXISTS `table_membre` ( `id` int(11) NOT NULL auto_increment, `champ1` varchar(80) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM; -- -- Contenu de la table `table_membre` -- INSERT INTO `table_membre` (`id`, `champ1`) VALUES (1, 'Angelik');
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 -- -- Structure de la table `table1` -- CREATE TABLE IF NOT EXISTS `table1` ( `id` int(11) NOT NULL auto_increment, `champ1` float NOT NULL, `champ2` varchar(80) NOT NULL default '', PRIMARY KEY (`id`) ) ENGINE=MyISAM; -- -- Contenu de la table `table1` -- INSERT INTO `table1` (`id`, `champ1`, `champ2`) VALUES (1, 50, 'Angelik'),(1, 30, 'Angelik'),(1, 10, 'Angelik'),(1, 50, 'Angelik');
...dans lesquelles je stocke mes valeurs dans leur champ respectif (nommons-le champ1 pour les 2 tables (table1 et table2), admettons 4 lignes pour chacune de ces tables avec les valeurs suivantes :
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 -- -- Structure de la table `table2` -- CREATE TABLE IF NOT EXISTS `table2` ( `id` int(11) NOT NULL auto_increment, `champ1` float NOT NULL, `champ2` varchar(80) NOT NULL default '', PRIMARY KEY (`id`) ) ENGINE=MyISAM; -- -- Contenu de la table `table2` -- INSERT INTO `table2` (`id`, `champ1`, `champ2`) VALUES (1, 20, 'Angelik'),(1, 20, 'Angelik'),(1, 10, 'Angelik'),(1, 5, 'Angelik');
50,30,10,50 ==> pour table1, champ1
et
20,20,10,5 ==> pour table2, champ1
Lors de ma requête, je souhaite additionner ces 4 valeurs (pour chaque table) qui, somme toute vraisemblance, devrait nous donner 140 pour table1 et 55 pour table2
Ainsi, je fais (naïvement) :
Ce qui se passe est assez logique (quoique...) et ...
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 $search = mysql_query("SELECT table_membre.id, SUM(table1.champ1) AS valeur1, SUM(table2.champ1) AS valeur2 FROM table_membre LEFT JOIN table1 ON table_membre.champ1 = table1.champ2 LEFT JOIN table2 ON table_membre.champ1 = table2.champ2 WHERE table_membre.champ1 = '$login' GROUP BY table_membre.id") or die ("ERROR:" . mysql_error()); $row = mysql_num_rows($search); $result1 = $row['valeur1']; $result2 = $row['valeur2']; while ($row = mysql_fetch_array($search)) { echo"result1 == ".$row['valeur1']."<br>"; echo"result2 == ".$row['valeur2']."<br>"; }
result1 pour table1 me donne 560 au lieu de 140 avec le calcul suivant : ((50+30+10+50)*4) ==> 4 étant le nombre d'enregistrements pour table2
et
result2 pour table2 me donne 220 au lieu de 55 avec le calcul suivant : ((20+20+10+5)*4) ==> 4 étant le nombre d'enregistrements pour table1 cette fois ...
De ces résultats, je me dis "tiens, je vais mettre un DISTINCT" dans ma requête tel que(pas folle...croyais-je)
Code : Sélectionner tout - Visualiser dans une fenêtre à part SUM(DISTINCT table1.champ1) AS valeur1, SUM(DISTINCT table2.champ1) AS valeur2
mais là ... L'addition, qui semblait correcte au premier abord, exclut du calcul les doublons ='''''(
donc pour result1, j'ai 90au lieu de 140 (50 étant enregistré 2 fois)
et pour result2, j'ai 35au lieu de 55 (20 étant enregistré 2 fois aussi)
CONCLUSION :
Sans modifier la structure de ma requête (j'ai de bonnes raisons à cela, croyez-moi) est-il possible de pallier à ce problème ? y a t-il une astuce ou autre pour que le DISTINCT additionne également les doublons ? J'espère que oui ... et prends toutes les solutions !
Merci d'avance pour toute l'attention et l'intérêt que vous porterez à ce post
++
Partager