【问题标题】:Left Join + count + sum on MySQLMySQL 上的左连接 + 计数 + 总和
【发布时间】:2016-08-25 11:32:03
【问题描述】:

这个问题类似于my previous question。但是有几个变种(我有高级 JOIN 的探针,我在论坛中找不到任何有用的信息)。

再次,我更改了表、字段和值的名称,只保留了我的数据库结构供您理解。

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

.

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

...

.

食物

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

...

.

但是我有数百个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

要得到这个:

ID | AGE | COUNTRY | ORAPPLE
1  |  25 |   usa   |    7

请注意,结果中的orappleunits 上的数字之和,具体而言,其中food 等于“橙色”和“苹果”。

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

ID | AGE | COUNTRY | ORAPPLE | FRUIT | FAST | CEREAL
1  |  25 |   usa   |    7    |   3   |  2   |   1   

【问题讨论】:

  • sum(category='fruit')
  • 你能对所有给定的类别进行硬编码,还是必须是动态的?
  • @PaulSpiegel 我可以对类别进行硬编码(在其他部分添加 cmets 以记住在新类别的情况下更改代码)。

标签: mysql join count sum


【解决方案1】:

使用来自

的结果
SELECT DISTINCT category FROM foods;

构造以下查询:

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/71e12/21

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

【讨论】:

  • 很好,这正是我想要的。谢谢。
  • @KennyLajara,我刚刚意识到您正在使用LEFT JOIN。因此,我更改了解决方案以防止结果中出现 NULL。可以在 sqlfiddle 中看到区别。
  • 哦,我明白了,谢谢。我真的很感谢你的回答。问题是我不知道 CASE WHEN。但现在一切都解决了。谢谢=D
猜你喜欢
  • 2019-05-19
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
  • 2016-08-24
  • 2023-03-21
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
相关资源
最近更新 更多