2011-02-14 41 views
6

我有兩個表,一個名爲日曆,另一個名爲事件。日曆中可以有多個日曆和多個事件。我想選擇每個日曆,並獲取日曆中的事件數量。SQL:獲得從左連接返回的行數

這是我有:

SELECT C.*, COUNT(*) AS events FROM `calendars` AS C 
    LEFT JOIN `events` E ON C.ID=E.calendar 
    GROUP BY C.ID 

但是,這並不工作。 沒有事件的項目仍然返回1有什麼想法?

回答

7

的問題是,you're計數行,而沒有的活動日曆,還有他的日曆的一行。

試試這個:

SUM(case when e.Calendar is null then 0 else 1 end) 
+0

這工作完美,並沒有涉及低效率的子選擇。謝謝! – 2011-02-14 15:52:27

18

您需要使用

COUNT(E.calendar) 

的行不匹配的這個值將是NULLNULL值不計算在內。

+2

哇!這比接受的答案更簡單,謝謝! – dimsuz 2014-06-27 10:43:21

1

如何:

SELECT C.*, (SELECT COUNT(*) FROM events E WHERE E.calendar=C.ID) as NumEvents 
FROM calendars C 
0

試試這個:

SELECT C.*, 
    (
     SELECT COUNT(*) 
     FROM [events] AS E 
     WHERE E.calendar = C.ID) AS [events] 
FROM [calendars] AS C;