分组不返回" 0"

时间:2015-10-16 22:30:38

标签: mysql sql group-by

我正在为两个表格进行SELECT查询。

表:

  • ec_events
  • ec_calendar

enter image description here

选择QUERY:

SELECT MONTH(`ec_calendar`.`Day`) AS Month ,COUNT(`ID_Event`) AS Count 
FROM `ec_events`,`ec_calendar` 
WHERE `ec_events`.`FK_Day`=`ec_calendar`.`ID_Day` AND YEAR(`ec_calendar`.`Day`) = 2015 
GROUP BY MONTH(`ec_calendar`.`Day`)

结果:

enter image description here

这里唯一的问题是5月(5个月)。在结果图像中,您可以看到,被忽略,因为在ec_calendar中本月没有条目。很多时候会更好,如果0可以返回。所以表格会如此:

....
3  15
4  7
5  0
6  10
7  3
...

有没有办法提供它?

2 个答案:

答案 0 :(得分:4)

使用LEFT JOIN

SELECT MONTH(`ec_calendar`.`Day`) AS Month ,COUNT(`ID_Event`) AS Count 
FROM `ec_events`
LEFT JOIN `ec_calendar` 
ON `ec_events`.`FK_Day`=`ec_calendar`.`ID_Day` 
WHERE YEAR(`ec_calendar`.`Day`) = 2015 
GROUP BY MONTH(`ec_calendar`.`Day`)

LEFT JOIN将保留左表中的所有记录,并填写与您的右表不匹配的NULL

答案 1 :(得分:1)

您必须创建一个表格allMonth,其中所有月份都是1..12,如果需要,您也可以添加年份字段。

sample 会让您了解如何在表格中填写日期范围

<强>整个月

 month_id
 year_id
 name

查询

SELECT AM.month_id AS Month, COUNT(`ID_Event`) AS Count 
FROM  allMonth  AM
LEFT JOIN `ec_calendar` EC
       ON AM.month_id = MONTH(EC.`Day`)
INNER JOIN `ec_events`  EV
       ON EV.`FK_Day`= EC.`ID_Day`
      AND YEAR(EC.`Day`) = 2015 
GROUP BY AM.month_id

有条件的提示:

  • 始终尝试使用别名来改善阅读
  • 了解如何使用显式连接语法。 Aaron Bertrand做了一些关于它的writting
相关问题