如何实现WHERE IN子句中无匹配的age返回count=0的SQL查询?
解决SQL统计指定年龄时显示无数据年龄的计数为0的问题
这问题我之前帮人处理过,要让那些没有对应用户的年龄也返回计数0,关键得先构造出你要统计的所有目标年龄集合,再和原数据表做左关联统计,这样就能把没数据的年龄也一并带出来了。
方法一:使用VALUES子句生成目标年龄列表(适合MySQL 8.0+、PostgreSQL等支持VALUES的数据库)
直接用VALUES生成你要查询的年龄集合,再通过LEFT JOIN关联原表,最后按年龄分组统计:
SELECT target_age.age, COUNT(vi.age) AS count_age FROM (VALUES (23), (26), (27)) AS target_age(age) LEFT JOIN visitor_interview vi ON target_age.age = vi.age GROUP BY target_age.age ORDER BY target_age.age DESC;
- 为什么这样能行?
LEFT JOIN会保留左边target_age里的所有年龄,哪怕原表visitor_interview里没有对应记录; COUNT(vi.age)只会统计原表中匹配到的非NULL年龄值,没匹配到的时候就会返回0。
方法二:用UNION ALL生成目标年龄列表(兼容旧版本MySQL等不支持VALUES的数据库)
如果你的数据库版本不支持VALUES,可以用UNION ALL拼接出目标年龄:
SELECT target_age.age, COUNT(vi.age) AS count_age FROM ( SELECT 23 AS age UNION ALL SELECT 26 AS age UNION ALL SELECT 27 AS age ) AS target_age LEFT JOIN visitor_interview vi ON target_age.age = vi.age GROUP BY target_age.age ORDER BY target_age.age DESC;
额外小提示
你原来的查询里SELECT name其实不太合理——因为按age分组后,name属于非聚合字段,不同数据库对这种写法的处理规则不一样(有的会报错,有的会返回随机的name),如果你只需要年龄和对应计数,记得去掉name字段哦。
内容的提问来源于stack exchange,提问作者user2288650
相关产品推荐
相关产品推荐

