MySQL 上的左连接 + 计数 + 总和

Posted

技术标签:

【中文标题】MySQL 上的左连接 + 计数 + 总和【英文标题】:Left Join + count + sum on MySQL 【发布时间】: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') 你能对所有给定的类别进行硬编码,还是必须是动态的? ***.com/questions/7674786/mysql-pivot-table @PaulSpiegel 我可以对类别进行硬编码(在其他部分添加 cmets 以记住在新类别的情况下更改代码)。 【参考方案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 上搜索 pivot-table 以查找更多示例。

【讨论】:

很好,这正是我想要的。谢谢。 @KennyLajara,我刚刚意识到您正在使用LEFT JOIN。因此,我更改了解决方案以防止结果中出现 NULL。可以在 sqlfiddle 中看到区别。 哦,我明白了,谢谢。我真的很感谢你的回答。问题是我不知道 CASE WHEN。但现在一切都解决了。谢谢=D

以上是关于MySQL 上的左连接 + 计数 + 总和的主要内容,如果未能解决你的问题,请参考以下文章

具有多个左连接和计数的错误计算(Laravel)

MYSQL:与 Group_Concatenate 一起使用的两个表上的左连接

PostgreSQL - 带有错误计数输出的左连接

mysql中的左连接和右连接有啥区别[重复]

深入浅出:MySQL的左连接右连接等值连接

为啥Mysql的左连接条件不被遵守?