组合LEFT / INNER JOIN + GROUP BY时缺少SQL条目

时间:2011-01-01 16:14:57

标签: mysql left-join inner-join

我有以下MySQL结构(最小化了很多):

CREATE TABLE `site_movies` (
  `id` int(10),
  `title` varchar(90),
  PRIMARY KEY (`id`)
) ENGINE=MyISAM;

INSERT INTO `site_movies` VALUES(1, 'Borrowers, The');
INSERT INTO `site_movies` VALUES(2, 'Louis C.K.: Chewed Up');
INSERT INTO `site_movies` VALUES(3, 'Louis C.K.: Shameless');
INSERT INTO `site_movies` VALUES(4, 'Vinni-Pukh');

CREATE TABLE `site_movies_directors` (
  `id` mediumint(8),
  `name` varchar(255),
  PRIMARY KEY (`id`)
) ENGINE=MyISAM;

CREATE TABLE `site_movies_directors_connections` (
  `movie_id` mediumint(8),
  `director_id` mediumint(8)
) ENGINE=MyISAM;

CREATE TABLE `site_movies_seen` (
  `object_id` int(10),
  `date` varchar(10),
  `rating` tinyint(2)
) ENGINE=MyISAM;

INSERT INTO `site_movies_seen` VALUES(1, '0', 4);
INSERT INTO `site_movies_seen` VALUES(2, '1293821757', 5);
INSERT INTO `site_movies_seen` VALUES(3, '1293821758', 7);
INSERT INTO `site_movies_seen` VALUES(4, '0', 6);

然后是以下查询(也最小化了很多):

SELECT m.title, s.date
FROM site_movies_seen s
INNER JOIN site_movies m ON s.object_id = m.id
LEFT JOIN site_movies_directors_connections AS mdc ON ( m.id = mdc.movie_id ) 
GROUP BY mdc.movie_id, s.date
ORDER BY s.date ASC

打印:

title   date 
Borrowers, The  0
Louis C.K.: Chewed Up   1293821757
Louis C.K.: Shameless   1293821758

请注意,“Vinni-Pukh”缺失,因为它是_seen表中第二个条目,日期= 0.如果几个entires具有相同的时间戳,我怎么能包括所有的entires?

1 个答案:

答案 0 :(得分:4)

将您的论坛按语句更改为:

GROUP BY m.id, s.date

您的加入条件为m.id = mdc.movie_id,因此您可能认为这两个字段始终相同,因此您是否在GROUP BY中写m.idmdc.movie_id无关紧要。这不是真的,因为您使用的是LEFT JOIN,而不是INNER JOIN。这意味着mdc.movie_id可以为NULL,并且所有NULL条目都进入同一组。

此外,由于您没有从site_movies_directors_connections中选择任何列,因此您应该完全从查询中省略它。

SELECT m.title, s.date
FROM site_movies_seen s
INNER JOIN site_movies m ON s.object_id = m.id
GROUP BY m.id, s.date
ORDER BY s.date