【问题标题】:Missing SQL entries when combining LEFT/INNER JOIN + GROUP BY组合 LEFT/INNER JOIN + GROUP BY 时缺少 SQL 条目
【发布时间】:2011-01-01 16:14:57
【问题描述】:

我有以下 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 的第二个条目。如何包含所有的整体,即使多个整体具有相同的时间戳?

【问题讨论】:

    标签: mysql left-join inner-join


    【解决方案1】:

    将您的 group by 语句更改为:

    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
    

    【讨论】:

    • 谢谢,马克!将 mdc.movi​​e_id 更改为 m.id 就可以了。关于导演的东西,这只是我的一些过度最小化代码的结果;-)
    猜你喜欢
    • 2016-04-11
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    相关资源
    最近更新 更多