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

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_danatotal
    APBD-OPD1
    APBD Kelurahan0
    APBD Prov/APBN1
    Non APBN/APBD0

方案二:从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:02:31