如何合并两条SQL SELECT语句 实现按用户分组展示不同status_id统计值
解决方法
你可以通过条件聚合的写法替代UNION拼接查询,即可实现同一用户只展示一行,不同status_id的计数作为独立列展示的需求:
SELECT users.id AS user_id, users.name, COUNT(CASE WHEN post_status.status_id = 2 THEN asigns.user_id END) AS status_2_count, COUNT(CASE WHEN post_status.status_id = 3 THEN asigns.user_id END) AS status_3_count FROM asigns LEFT JOIN post_status ON asigns.post_id = post_status.post_id RIGHT JOIN users ON asigns.user_id = users.id WHERE post_status.status_id IN (2, 3) GROUP BY users.id, users.name
逻辑说明
- 原查询用UNION拼接的两条语句返回的行
status_id值不同,因此不会被UNION自动去重,才会出现同一用户重复展示的问题 - 新写法先通过WHERE筛选出仅需要统计的status_id=2和3的记录,缩小计算范围
- 利用CASE语句在COUNT聚合时仅统计对应状态的有效记录,分别生成两个状态的独立计数字段
- 仅需一次GROUP BY按用户聚合,即可得到最终的单行用户统计结果
如果需要保留所有用户(哪怕两个状态的计数都为0),直接删除WHERE子句即可,没有对应状态的用户计数会自动返回0。
内容的提问来源于stack exchange,提问作者rksh
相关产品推荐
相关产品推荐

