2010-08-28 70 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