MySQL - 为什么count()会改变外连接的行为?

时间:2010-08-28 23:36:07

标签: mysql

MySQL - 为什么count()会改变join

的行为

我有一个简单的案例。活动和与会者。在我的测试下面没有与会者,但我仍然想要一个事件列表,所以我使用外连接,这是有效的。但是,如果我想要一个事件列表和与会者的数量,它只返回第一行。为什么

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

为什么?

1 个答案:

答案 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