我有以下 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 的第二个条目。即使多个整体具有相同的时间戳,我如何包含所有整体?
最佳答案
将您的 group by 语句更改为:
GROUP BY m.id, s.date
您的连接条件是 m.id = mdc.movie_id
,因此您可能认为这两个字段始终相等,因此是否编写 m.id< 并不重要
或 mdc.movie_id
在您的 GROUP BY 中。这不是真的,因为您使用的是 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
关于mysql - 组合 LEFT/INNER JOIN + GROUP BY 时缺少 SQL 条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4574651/