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
请注意,结果中的orapple
是units
上的数字之和,具体而言,其中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 上的左连接 + 计数 + 总和的主要内容,如果未能解决你的问题,请参考以下文章