You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 06:28:21