MySql含有GROUP BY子句的查询中如何显示COUNT()为0的结果

前阶段工作中发现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

深入了解:

        http://blog.csdn.net/wei763328075qq/article/details/50956712



  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值