You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MySQL中如何统计并展示表中不存在数据的count(*)值——补充分组查询缺失分类结果

解决MySQL中显示不存在分组的count(*)值问题

这个问题我之前处理过,要把原表中不存在的分组也展示出来并统计为0,核心思路是先构造出所有你需要的分组选项,再和原表的统计结果做左连接,这样就能覆盖所有预期的分组啦!

针对你的需求,这里给出具体的SQL语句:

SELECT 
    COALESCE(t.count_num, 0) AS `count(1)`,
    CASE s.is_purchased 
        WHEN 1 THEN '已购买' 
        WHEN 0 THEN '未购买' 
    END AS is_purchased
FROM (
    -- 生成所有需要统计的is_purchased取值(这里是0和1)
    SELECT 1 AS is_purchased UNION SELECT 0 AS is_purchased
) s
LEFT JOIN (
    -- 原表的分组统计结果
    SELECT is_purchased, COUNT(1) AS count_num
    FROM game_engine.temp 
    GROUP BY is_purchased
) t ON s.is_purchased = t.is_purchased;

关键步骤解释:

  • 构造分组选项表s:用UNION生成你需要的所有is_purchased可能取值(这里是0和1),这个临时表会固定包含这两行数据,不管原表有没有对应记录。
  • 左连接统计结果:将分组选项表s左连接原表的统计结果t,这样即使原表中没有某个取值(比如0),左连接后对应的count_num会是NULL
  • 处理NULL值:用COALESCE函数把NULL转换成0,就得到了不存在分组的统计值。
  • 转换为中文标签:通过CASE语句把数字类型的is_purchased转换成你需要的中文名称(已购买/未购买)。

如果之后is_purchased有更多可能的取值,只需要在s子句里添加更多UNION SELECT语句即可,比如:

SELECT 1 AS is_purchased UNION SELECT 0 AS is_purchased UNION SELECT 2 AS is_purchased

内容的提问来源于stack exchange,提问作者yasmin

火山引擎 最新活动