MySQL上的Left Join + count + sum

Ken*_*ara 8 mysql join sum count

这个问题与我之前的问题类似.但有几个变种(我有高级JOIN的探针,我在论坛中找不到任何有用的信息).

同样,我更改了表,字段和值的名称,只保留了数据库的结构供您理解.

现在,让我们假设我有这个(我不能改变结构):

.

ID | AGE | COUNTRY 
1  |  25 |   usa   
2  |  46 |   mex   

...
Run Code Online (Sandbox Code Playgroud)

.

食品

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

...
Run Code Online (Sandbox Code Playgroud)

.

但我有数以百计的people关系在表中foods,大约有八个类别foods,每个类别有4到24个food.

很好,目前我正在使用类似于这个的代码:

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
Run Code Online (Sandbox Code Playgroud)

要得到这个:

ID | AGE | COUNTRY | ORAPPLE
1  |  25 |   usa   |    7
Run Code Online (Sandbox Code Playgroud)

请注意,orapple结果是数字的总和units,具体而言,其中food等于'orange'和'apple'.

现在,我需要它来添加每个类别的数量,例如,我需要这个:

ID | AGE | COUNTRY | ORAPPLE | FRUIT | FAST | CEREAL
1  |  25 |   usa   |    7    |   3   |  2   |   1   
Run Code Online (Sandbox Code Playgroud)

Pau*_*gel 3

使用结果

SELECT DISTINCT category FROM foods;
Run Code Online (Sandbox Code Playgroud)

构造以下查询:

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;
Run Code Online (Sandbox Code Playgroud)

http://sqlfiddle.com/#!9/71e12/21

在网络或 SO 中搜索以查找更多示例。