Соединение двух таблиц, но как показать все результаты? - PullRequest
1 голос
/ 09 марта 2011

У меня есть две структуры таблиц, подобные этим:

episodes (
episode_id MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
episode_series_id MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0',
episode_series_season TINYINT(2) UNSIGNED NOT NULL DEFAULT '0',
episode_series_episode SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0',
episode_title VARCHAR(200) NOT NULL DEFAULT '',
PRIMARY KEY (episode_id),
KEY series_id (episode_series_id),
KEY episode_series_season (episode_series_season),
KEY episode_series_episode (episode_series_episode)
) ENGINE=MyISAM;

watchlist (
watchlist_id MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
watchlist_user_id MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0',
watchlist_series_id MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0',
watchlist_series_episode_id MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0',
watchlist_status TINYINT(1) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (watchlist_id),
KEY watchlist_series_episode_id (watchlist_series_episode_id),
KEY watchlist_series_id (watchlist_series_id)
) ENGINE=MyISAM;"

Я хочу присоединиться к этим двум и показать все результаты.

Это мне не помогло:

SELECT e.*, w.* FROM episodes e, watchlist w WHERE e.episode_series_id='1' AND e.episode_series_season='1' AND w.watchlist_user_id='1'

Я использую этот запрос, но, как обычно, он показывает только совпадающие столбцы (более 30 строк в таблице эпизодов, 2 строки в таблице наблюдения)

SELECT e.*,w.* FROM episodes e INNER JOIN watchlist w ON e.episode_id=w.watchlist_series_episode_id WHERE e.episode_series_id='1' AND e.episode_series_season='1' AND w.watchlist_user_id='1'

Но он показывает только 2 строки (как и должно быть).

episode_id  episode_series_id   episode_series_season   episode_series_episode  episode_title   watchlist_id    watchlist_user_id   watchlist_series_id watchlist_series_episode_id watchlist_status
1                 1                       1                      1                    Pilot            1                 1                    1                    1                        0
2                 1                       1                      2                 Paternity           2                 1                    1                    2                        0 

Но я хочу показать все подходящие результаты (я хочу выбрать все столбцы из этих двух таблиц, перечислить эпизоды, если совпадение из списка наблюдения, я хочу заполнить данные из столбца списка наблюдения, иначе они должны быть нулевыми)

Я хочу получить такие результаты:

episode_id  episode_series_id   episode_series_season   episode_series_episode  episode_title   watchlist_id    watchlist_user_id   watchlist_series_id watchlist_series_episode_id watchlist_status
1                 1                       1                      1                    Pilot            1                 1                    1                    1                        0
2                 1                       1                      2                 Paternity           2                 1                    1                    2                        0 
3                 1                       1                      3                  whatever1         null             null                 null                 null                      null 
4                 1                       1                      4                  whatever2         null             null                 null                 null                      null 
5                 1                       1                      5                  whatever3         null             null                 null                 null                      null 

Я не мог собрать это вместе. Как я могу это сделать?

Спасибо.

Ответы [ 4 ]

5 голосов
/ 09 марта 2011

Для этого LEFT JOIN вместо INNER JOIN

SELECT e.*,w.* 
FROM episodes e 
LEFT JOIN watchlist w 
   ON e.episode_id=w.watchlist_series_episode_id AND w.watchlist_user_id='1'
WHERE e.episode_series_id='1' 
AND e.episode_series_season='1' 
  • Условие w.watchlist_user_id также должно появляться в предложении ON.
0 голосов
/ 09 марта 2011

Попробуйте оставить эпизод присоединения слева и список наблюдения справа .... Он вернет все эпизоды и соответствующий список наблюдения, если таковые имеются ...

0 голосов
/ 09 марта 2011

Измените INNER JOIN на OUTER JOIN или LEFT JOIN (что составляет LEFT OUTER JOIN).

0 голосов
/ 09 марта 2011

Просто используйте LEFT JOIN?

SELECT * FROM episodes e 
LEFT JOIN watchlist w ON e.episode_id = w.watchlist_series_episode_id 
WHERE e.episode_series_id='1' 
AND e.episode_series_season='1' 
AND w.watchlist_user_id='1'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...