MySQL查询如何将枚举值的0计数结果纳入同一张结果表
解决MySQL枚举类型全值统计(含0计数)的问题
刚好碰到过类似需求,要统计枚举字段所有可能值的出现次数,包括那些在表中没有对应数据的选项(计数为0),核心思路是先构造包含所有枚举值的数据集,再和原表做左关联统计。
方案一:直接枚举所有选项(简单直观)
因为你的sumber_dana枚举选项是固定的,我们可以用UNION ALL生成包含所有选项的临时表,再左连接原表分组计数:
SELECT enum_values.sumber_dana, COUNT(u.sumber_dana) AS total FROM ( -- 列出所有枚举选项 SELECT 'APBD-OPD' AS sumber_dana UNION ALL SELECT 'APBD Kelurahan' AS sumber_dana UNION ALL SELECT 'APBD Prov/APBN' AS sumber_dana UNION ALL SELECT 'Non APBN/APBD' AS sumber_dana ) AS enum_values -- 左连接确保所有枚举值都被保留 LEFT JOIN usulan u ON enum_values.sumber_dana = u.sumber_dana GROUP BY enum_values.sumber_dana ORDER BY enum_values.sumber_dana;
关键细节:
- 用
COUNT(u.sumber_dana)而不是COUNT(*):当左连接没有匹配到原表数据时,u.sumber_dana会是NULL,COUNT()会忽略NULL值,从而得到0;如果用COUNT(*),会把每条无匹配的记录算成1,结果就不对了。 - 执行这段SQL后,就能得到你想要的结果:
sumber_dana total APBD-OPD 1 APBD Kelurahan 0 APBD Prov/APBN 1 Non APBN/APBD 0
方案二:从information_schema动态获取枚举选项(灵活扩展)
如果以后枚举选项可能修改,不想每次改SQL,可以从系统表中读取枚举的所有选项:
SELECT enum_values.sumber_dana, COUNT(u.sumber_dana) AS total FROM ( -- 从information_schema解析枚举选项 SELECT TRIM("'" FROM SUBSTRING_INDEX(SUBSTRING_INDEX(c.COLUMN_TYPE, ',', n.n), "'", -1)) AS sumber_dana FROM INFORMATION_SCHEMA.COLUMNS c CROSS JOIN ( SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 ) n WHERE c.TABLE_SCHEMA = DATABASE() AND c.TABLE_NAME = 'usulan' AND c.COLUMN_NAME = 'sumber_dana' AND n.n <= (LENGTH(c.COLUMN_TYPE) - LENGTH(REPLACE(c.COLUMN_TYPE, ',', '')) + 1) ) AS enum_values LEFT JOIN usulan u ON enum_values.sumber_dana = u.sumber_dana GROUP BY enum_values.sumber_dana ORDER BY enum_values.sumber_dana;
说明:
- 这段SQL通过解析
COLUMN_TYPE字段(比如enum('APBD-OPD','APBD Kelurahan',...))来提取所有枚举值,CROSS JOIN的数字表要覆盖枚举值的最大数量(这里是4个,所以选1-4)。 - 好处是以后修改枚举选项,不用改统计SQL,自动适配新的选项。
内容的提问来源于stack exchange,提问作者Muhammad Rizki
相关产品推荐
相关产品推荐

