MySQL使用GROUP BY和CASE语句未获预期统计结果求助
问题解决:GROUP BY与CASE语句实现权限统计行合并
问题根源
你的SQL出现多行拆分和null值的问题,原因有两点:
- GROUP BY子句同时包含
db.title和da.type,导致每个title会按权限类型(VIEW/EDIT)拆分成独立行 - CASE语句未正确结合聚合逻辑,仅在匹配对应type时返回统计值,其余场景直接返回null
修正后的SQL语句
SELECT db.title, COUNT(CASE WHEN da.type = 'VIEW' THEN da.user_id END) AS ViewersCount, COUNT(CASE WHEN da.type = 'EDIT' THEN da.user_id END) AS EditorsCount FROM dashboard db LEFT JOIN dashboard_access da ON db.id = da.dashboard_id GROUP BY db.title;
逻辑说明
- GROUP BY仅保留
db.title:确保每个dashboard title只生成一行结果 - COUNT结合CASE:CASE仅在权限类型匹配时返回
user_id,否则返回null;COUNT会自动忽略null值,精准统计对应权限的用户数量 - 保留LEFT JOIN:如果存在无任何权限记录的dashboard,依然会显示title,对应统计值为0(COUNT对全null场景返回0)
等价写法(使用SUM)
如果更习惯用SUM统计,也可以这样写:
SELECT db.title, SUM(CASE WHEN da.type = 'VIEW' THEN 1 ELSE 0 END) AS ViewersCount, SUM(CASE WHEN da.type = 'EDIT' THEN 1 ELSE 0 END) AS EditorsCount FROM dashboard db LEFT JOIN dashboard_access da ON db.id = da.dashboard_id GROUP BY db.title;
两种写法都能得到你预期的结果:
| title | ViewersCount | EditorsCount |
|---|---|---|
| Recog | 6 | 6 |
| Mile | 4 | 2 |
内容的提问来源于stack exchange,提问作者mr_djay619
相关产品推荐
相关产品推荐

