MySQL统计hasTrackingNb各状态数量 如何展示全部三种状态即使计数为0
问题根因
你第二次编写的查询不符合预期,核心有两个问题:
- 使用
COUNT(*)统计所有左连接生成的行,哪怕对应盒子不属于shouldBeTracked=1的类型也会被计数 - 没有对不需要统计的盒子类型做过滤,导致普通盒子的记录也被纳入统计范围
正确查询语句
推荐使用提前过滤符合条件盒子的写法,逻辑更直观:
SELECT J.hasTrackingNb, COUNT(A.id) AS NB FROM (SELECT 0 hasTrackingNb UNION ALL SELECT 1 UNION ALL SELECT 2) J LEFT JOIN ( -- 先筛选出所有需要跟踪类型的盒子 SELECT box.* FROM box INNER JOIN box_type ON box.fk_type = box_type.id WHERE box_type.shouldBeTracked = 1 ) A ON J.hasTrackingNb = A.hasTrackingNb GROUP BY J.hasTrackingNb;
如果要在你原来的修改版本基础上调整,只需要修改计数逻辑即可:
SELECT J.hasTrackingNb, COUNT(CASE WHEN box_type.id IS NOT NULL THEN box.id END) AS NB FROM (SELECT 0 hasTrackingNb UNION ALL SELECT 1 UNION ALL SELECT 2) J LEFT OUTER JOIN box ON box.hasTrackingNb=J.hasTrackingNb LEFT OUTER JOIN box_type ON box.fk_type=box_type.id AND box_type.shouldBeTracked=1 GROUP BY J.hasTrackingNb;
逻辑说明
两种写法都能保证:
- 必须保留
hasTrackingNb的三个枚举值,哪怕没有对应记录 - 仅统计属于
shouldBeTracked=1类型的盒子 - 没有对应记录的状态计数返回0,完全符合预期结果
内容的提问来源于stack exchange,提问作者Club_RI
相关产品推荐
相关产品推荐

