2011-02-14 43 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;