Отсутствующие записи SQL при объединении LEFT / INNER JOIN + GROUP BY - PullRequest
1 голос
/ 01 января 2011

У меня есть следующая структура 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

Обратите внимание, что "Винни-Пух" отсутствует, потому что это вторая запись в таблице _seen с датой = 0. Как я могу включить все записи, даже если несколько записей имеют одинаковую метку времени?

1 Ответ

4 голосов
/ 01 января 2011

Измените свою группу по утверждению следующим образом:

GROUP BY m.id, s.date

Ваше условие объединения говорит m.id = mdc.movie_id, так что вы можете подумать, что эти два поля всегда равны, и поэтому не имеет значения, пишете ли вы m.id или mdc.movie_id в вашем GROUP BY.Это не так, потому что вы используете левое соединение, а не внутреннее соединение.Это означает, что 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...