Plusieurs Left Join sur la même table
J'ai deux table de.
1ère table => membre {member_id, le nom, l'actif}
2ème table => épargne {savings_id, member_id, le mois, l'année, la quantité, le type, payé}
Table Membre
+-----------+--------+--------+
| member_id | name | active |
+-----------+--------+--------+
| 105 | Andri | 1 |
| 106 | Steve | 1 |
| 110 | Soraya | 1 |
| 111 | Eva | 1 |
| 112 | Sonia | 1 |
+-----------+--------+--------+
Épargne Table
+------------+-----------+-------+------+--------+------+------+
| savings_id | member_id | month | year | amount | type | paid |
+------------+-----------+-------+------+--------+------+------+
| 1 | 120 | NULL | NULL | 150000 | 1 | 1 |
| 14 | 105 | 7 | 2014 | 80000 | 2 | 1 |
| 15 | 105 | 7 | 2014 | 25000 | 3 | 1 |
| 16 | 105 | 7 | 2014 | 60000 | 4 | 1 |
| 17 | 105 | 7 | 2014 | 100000 | 5 | 1 |
| 18 | 106 | 7 | 2014 | 80000 | 2 | 1 |
| 19 | 106 | 7 | 2014 | 25000 | 3 | 1 |
| 20 | 106 | 7 | 2014 | 60000 | 4 | 1 |
| 21 | 106 | 7 | 2014 | 100000 | 5 | 1 |
| 31 | 110 | 7 | 2014 | 25000 | 3 | 1 |
| 32 | 110 | 7 | 2014 | 60000 | 4 | 1 |
| 33 | 110 | 7 | 2014 | 100000 | 5 | 1 |
| 34 | 111 | 7 | 2014 | 80000 | 2 | 1 |
| 35 | 111 | 7 | 2014 | 25000 | 3 | 1 |
| 36 | 111 | 7 | 2014 | 60000 | 4 | 1 |
| 37 | 111 | 7 | 2014 | 100000 | 5 | 1 |
| 38 | 112 | 7 | 2014 | 80000 | 2 | 1 |
| 39 | 112 | 7 | 2014 | 25000 | 3 | 1 |
| 40 | 112 | 7 | 2014 | 60000 | 4 | 1 |
| 41 | 112 | 7 | 2014 | 100000 | 5 | 1 |
| 85 | 105 | 7 | 2015 | 80000 | 2 | 1 |
| 86 | 105 | 7 | 2015 | 25000 | 3 | 1 |
| 87 | 105 | 7 | 2015 | 60000 | 4 | 1 |
| 88 | 105 | 7 | 2015 | 100000 | 5 | 1 |
| 89 | 106 | 7 | 2015 | 80000 | 2 | |
| 90 | 106 | 7 | 2015 | 25000 | 3 | |
| 91 | 106 | 7 | 2015 | 60000 | 4 | |
| 92 | 106 | 7 | 2015 | 100000 | 5 | |
| 101 | 110 | 7 | 2015 | 80000 | 2 | |
| 102 | 110 | 7 | 2015 | 25000 | 3 | |
| 103 | 110 | 7 | 2015 | 60000 | 4 | |
| 104 | 110 | 7 | 2015 | 100000 | 5 | |
| 105 | 111 | 7 | 2015 | 80000 | 2 | 1 |
| 106 | 111 | 7 | 2015 | 25000 | 3 | 1 |
| 107 | 111 | 7 | 2015 | 60000 | 4 | 1 |
| 108 | 111 | 7 | 2015 | 100000 | 5 | 1 |
| 109 | 112 | 7 | 2015 | 80000 | 2 | |
| 110 | 112 | 7 | 2015 | 25000 | 3 | |
| 111 | 112 | 7 | 2015 | 60000 | 4 | |
| 144 | 110 | 7 | 2014 | 50000 | 1 | 1 |
+------------+-----------+-------+------+--------+------+------+
Lorsqu'un membre de faire des économies, ils pouvaient choisir 5 type de l'épargne, Ce que je veux faire est de faire une liste de membres et l'ensemble de leur économie.
C'est de requête mysql
SELECT m.member_id, name,
SUM(s1.amount) as savings1,
SUM(s2.amount) as savings2,
SUM(s3.amount) as savings3,
SUM(s4.amount) as savings4,
SUM(s5.amount) as savings5
FROM members m
LEFT JOIN savings s1 ON s1.member_id = m.member_id AND s1.type = 1 AND s1.paid = 1
LEFT JOIN savings s2 ON s2.member_id = m.member_id AND s2.type = 2 AND s2.paid = 1
LEFT JOIN savings s3 ON s3.member_id = m.member_id AND s3.type = 3 AND s3.paid = 1
LEFT JOIN savings s4 ON s4.member_id = m.member_id AND s4.type = 4 AND s4.paid = 1
LEFT JOIN savings s5 ON s5.member_id = m.member_id AND s5.type = 5 AND s5.paid = 1
WHERE
active = 1
GROUP BY m.member_id
C'est la sortie
+-----------+--------+----------+----------+----------+----------+----------+
| member_id | name | savings1 | savings2 | savings3 | savings4 | savings5 |
+-----------+--------+----------+----------+----------+----------+----------+
| 105 | Andri | NULL | 1280000 | 400000 | 960000 | 1600000 |
| 106 | Steve | NULL | 80000 | 25000 | 60000 | 100000 |
| 110 | Soraya | 50000 | NULL | 25000 | 60000 | 100000 |
| 111 | Eva | NULL | 1280000 | 400000 | 960000 | 1600000 |
| 112 | Sonia | NULL | 80000 | 25000 | 60000 | 100000 |
+-----------+--------+----------+----------+----------+----------+----------+
Comme vous pouvez le voir, le calcul n'est pas droit, par exemple savings2 pour membre 105 il convient de 160K. Toute suggestion visant à ce que devrait être la requête pour ce cas.
http://sqlfiddle.com/#!2/9eca9/1
Ne serait-il pas plus simple de faire un GROUPE PAR m.member_id, s.type " puis faites pivoter autour de membre-id?
OriginalL'auteur l1th1um | 2014-07-04
Vous devez vous connecter pour publier un commentaire.
Le problème est que vous êtes formant le full join produit avant sommation. Donc, si il n'y a plus d'une ligne dans plus d'une de vos
savings
tables vous allez vous retrouver avec des doublons. Si vous effectuer la jointure sans sommation, vous pouvez voir clairement ce qui se passe. Il y a deux façons de contourner cela.Faire tous les débats dans les tables dérivées:
Rejoindre une fois et utilisez une somme conditionnelle:
la puissance de
SUM
avecCASE
fonction au sein de vraiment de raccourcir le sql.Oui, et je me dois de mentionner qu'il ne fonctionne que parce qu'il réduit la jointure d'une table unique. Si vous aviez à la somme des enregistrements sur plusieurs tables vous ne pouvait pas le faire parce que vous auriez toujours obtenir un produit Cartésien de lignes.
OriginalL'auteur lc.
Vous n'avez probablement pas besoin de plusieurs left join et pourrait être fait dans le
Je pense qu'il y a une erreur pour member_id=106 pour saving2 en fait, il devient
80000
et votre requête sera de retour160000
Vous devez ajouter une autre condition, comme
s.paid = 1
ainsi, obtenir le résultat correct.oui, l'ajout de la condition en sera que
80000
mais il semble que le COOP est à la recherche d'savings2 for member 105 it should be 160K
Lorsque vous ajouter une condition
s.paid = 1
puis aussi satisfaire aux exigences de l'utilisateur et corrigée de sortieOriginalL'auteur Abhik Chakraborty
cela devrait fonctionner
OriginalL'auteur user3800108
Il semble se joindre a le problème.. U peut aller au-dessus de toutes les réponses sont une bonne option..
U peut utiliser Pivot Requête aussi
//Pivot ici
et puis essayez de faire pivoter facilement mec.. Ce serait aussi sympa...
OriginalL'auteur sarathkumar