Left Join + count + somme sur MySQL
Cette question est similaire à ma question précédente. Mais avec plusieurs variantes (j'ai des probems avec des jointures avancées et je n'ai pas pu trouver d'infos utiles dans le forum).
encore une fois, j'ai changé le nom des tables, des champs et des valeurs, en gardant juste la structure de ma base de données pour que vous puissiez comprendre.
maintenant, supposons que j'ai ceci (et je ne peux pas changer le de la structure):
.
ID | AGE | COUNTRY
1 | 25 | usa
2 | 46 | mex
...
.
Aliments
ID | PERSON_ID | CATEGORY | FOOD | UNITS
1 | 1 | fruit | apple | 2
2 | 1 | fruit | grape | 24
3 | 1 | fruit | orange | 5
3 | 1 | fast | pizza | 1
4 | 1 | fast | hamburguer | 3
5 | 1 | cereal | corn | 2
...
.
Mais j'ai des centaines d' people
tous avec leur relation dans le tableau foods
, à environ huit catégories foods
et chaque catégorie A 4 à 24 food
.
Fine, je suis actuellement en utilisant un code similaire à celui-ci:
SELECT p.*, SUM(f.units) as orapple
FROM people p
LEFT JOIN foods f
ON f.person_id = p.id
AND f.food in('apple','orange')
WHERE p.id = 1
GROUP BY p.id
Pour obtenir ceci:
ID | AGE | COUNTRY | ORAPPLE
1 | 25 | usa | 7
Notez que orapple
dans le résultat est la somme des nombres sur units
, plus précisément, où food
est égal à "orange" et "pomme".
maintenant, ce dont j'ai besoin pour ajouter le nombre de chaque catégorie, exemple, j'ai besoin de ceci:
ID | AGE | COUNTRY | ORAPPLE | FRUIT | FAST | CEREAL
1 | 25 | usa | 7 | 3 | 2 | 1
1 réponses
utilisez le résultat de
SELECT DISTINCT category FROM foods;
pour construire la requête suivante:
SELECT p.*,
SUM(CASE WHEN f.food in ('apple','orange') THEN f.units ELSE 0 END) as orapple,
COUNT(f.category='fruit' OR NULL) AS fruits,
COUNT(f.category='fast' OR NULL) AS fast,
COUNT(f.category='cereal' OR NULL) AS cereal
FROM people p
LEFT JOIN foods f
ON f.person_id = p.id
WHERE p.id = 1
GROUP BY p.id;
http://sqlfiddle.com/#!9 / 31e12/21
Recherche sur le web ou ALORS tableau croisé dynamique pour trouver plus d'exemples.