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   
8
demandé sur Community 2016-04-30 12:14:49

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 pour trouver plus d'exemples.

3
répondu Paul Spiegel 2016-04-30 15:32:22