问题
前阶段工作中发现MySQL含有GROUP BY子句的查询中COUNT()为0的结果不显示.
而针对于分组统计的此类问题,多数人(包括本人)通常会想到:
SELECT PID,COUNT(1) AS SUM FROM SS WHERE FIAG = 1 GROUP BY PID
但是,会出现总数为0的不在统计之列.
原因
因为在SELECT语句中WHERE子句先于GROUP BY执行,因此在执行GROUP BY子句时,表中的记录已经被过滤.
SQL SELECT语句完整的执行顺序:
1、FROM子句组装来自不同数据源的数据;
2、WHERE子句基于指定的条件对记录进行筛选;
3、GROUP BY子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用HAVING子句筛选分组;
6、计算所有表达式;
7、使用ORDER BY对结果进行排序。
解决
- 构造含有所有PID的结果集与其上述语句所得结果集进行左连接,并利用IFNULL()替换函数(如SQL SERVER中的ISNULL()、ORACLE中的NVL())将NULL替换为0。
SELECT DISTINCT m.PID,IFNULL(s.sum, 0) AS SUM FROM SS AS m
LEFT JOIN
(SELECT PID,COUNT(1) AS sum FROM SS WHERE FIAG = 1 GROUP BY PID) AS s
ON m.PID = s.PID