MySQL如何使用COUNT()统计不同status值并输出为多列结果
优化方案:使用条件聚合单次查询完成统计
你可以通过条件聚合的方式实现需求,仅需一次查询就能得到符合要求的结果,比你现在用三次单独查询的方案性能更高,也不需要额外处理结果拼接的问题。
通用写法(兼容所有主流数据库)
SELECT username, COUNT(CASE WHEN status = 'steady' THEN 1 END) AS steady, COUNT(CASE WHEN status = 'ready' THEN 1 END) AS ready, COUNT(CASE WHEN status = 'go' THEN 1 END) AS go FROM users GROUP BY username;
逻辑说明
- 先通过
GROUP BY username将所有记录按用户名分组,每个用户的所有记录归为同一组 - 每组内通过
CASE WHEN判断每行的status是否匹配对应状态,匹配则返回1,不匹配返回NULL COUNT函数统计时会自动忽略NULL值,最终就能得到每个用户各状态的记录数,无对应状态的用户会自动返回0,不需要额外补值
MySQL简化写法
如果你用的是MySQL数据库,可以用IF函数简化语法:
SELECT username, SUM(IF(status = 'steady', 1, 0)) AS steady, SUM(IF(status = 'ready', 1, 0)) AS ready, SUM(IF(status = 'go', 1, 0)) AS go FROM users GROUP BY username;
方案优势
- 仅需要扫描一次users表,数据量越大性能优势越明显,远优于三次单独查询的方案
- 直接输出你需要的宽表结构,不需要额外拼接三次查询的结果
- 不会遗漏无对应状态的用户,不需要手动补0处理,避免逻辑漏洞
内容的提问来源于stack exchange,提问作者Kadek Cahya
相关产品推荐
相关产品推荐

