2015-10-16 54 views
0

Im making a SELECT查询为两个表。Group by does not return“0”

表:

  • ec_events
  • ec_calendar

enter image description here

SELECT查询:

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 
... 

有什么办法可以提供吗?

+0

什么是ec_calendar表? –

+0

正确的是'ID_Day'和'Day'柱。 – Bullman

回答

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 

aditional的TIPS的想法:

  • 始终尝试使用别名来提高读数
  • 了解如何使用显式连接语法。 Aaron Bertrand做了一些关于它的writting
+0

我不认为,那使另一个表是很好的解决方案。这里必须是更简单的方式,但谢谢你的时间和答案。 – Bullman

+0

@布尔曼,对不起,但没有。我已经多次回答同样的问题。用户缺少“年”。 'month'或'days'在所有情况下,答案都是创建一个表格。并使用我包含的存储过程来填充表格。 –

+0

例如,包含一个'100'年的表格只有'36,500',因此非常小,并且相信我做了数学计算,并且在执行时间上都不昂贵。一个月的表格只有'1200行' –

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 S其中不匹配到您的权利填写表格。

+0

不工作,仍然忽略5个月。 – Bullman

+3

这不会工作,因为你的左侧没有一个月'5',你需要一个aditional'allMonths'表 –

+0

正确的想法。 'from'子句中表格的错误订单。 –