2015-10-16 119 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'子句中表格的錯誤訂單。 –