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




