2010-08-28 22 views
2

MySQL - 爲什麼count()改變加入的行爲MySQL - 爲什麼count()會改變外連接的行爲?

我有一個簡單的例子。活動和與會者。在我下面的測試中,沒有與會者,但我仍然想要一個事件列表,所以我使用了一個外部聯接並且可以工作。但是,如果我需要事件列表和與會者數量,它只會返回第一行。爲什麼

CREATE TABLE IF NOT EXISTS `event` (
`event_id` int(11) NOT NULL AUTO_INCREMENT, 
`event_name` varchar(50) NOT NULL, 
PRIMARY KEY (`event_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ; 

CREATE TABLE IF NOT EXISTS `attendees` (
    `event_id` int(11) NOT NULL, 
    `attendee` varchar(50) NOT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

INSERT INTO `event` (`event_id`, `event_name`) 
VALUES 
(1, 'event one'), 
(2, 'event two'), 
(3, 'event three'); 

    SELECT e.*, a.attendee 
    FROM `event` e 
left outer join attendees a on e.event_id = a.event_id 

回報:

event_id event_name attendee 
--------------------------------- 
1   event one NULL 
2   event two NULL 
3   event three NULL 

但是:

SELECT e.*, count(a.attendee) 
    FROM `event` e 
left outer join attendees a on e.event_id = a.event_id 

只返回:

event_id  event_name count(a.attendee) 
--------------------------------------------- 
1   event one  0 

爲什麼呢?

回答

3

如果在不指定GROUP BY的情況下添加聚合函數,則會得到與由所有行組成的單個組相對應的一行。

如果你想爲每個組計數,你應該添加一個顯式的GROUP BY子句。

SELECT e.*, COUNT(a.attendee) 
FROM `event` e 
LEFT OUTER JOIN attendees a ON e.event_id = a.event_id 
GROUP BY e.event_id 
+0

完美 - 工程! SELECT e。*,count(a.attendee)FROM'event' e left outer join attendees a on e.event_id = a.event_id group by event_id – sdfor 2010-08-28 23:41:56

+0

如果我需要參加者人數和廣告人名單? – sdfor 2010-08-29 00:46:48

+0

@sdfor:我會做兩個單獨的查詢。或查詢與會者列表,然後在客戶端中對其進行計數。 – 2010-08-29 00:49:04

相關問題