SQL JOIN многие-ко-многим - программирование
Подтвердить что ты не робот

SQL JOIN многие-ко-многим

Извините за минималистский титул, но я не знаю, как его кратко описать. У меня три таблицы:

Таблица групп

ID | Genre
-----------------
1  | Action
2  | Adventure
3  | Drama

Множество таблиц

GroupID | ElementID
-----------------
    3   |    1
    1   |    2
    2   |    2
    2   |    3
    3   |    3

И таблица элементов

ID | Element
-----------------
1  | Pride and Prejudice
2  | Alice in Wonderland
3  | Curious Incident Of A Dog In The Night Time

Все прекрасно и очень просто. SELECT, которого я пытаюсь достичь, следующий

ID | Element                                         |  Genre
-------------------------------------------------------------
1  | Pride and Prejudice                             | Drama
2  | Alice in Wonderland                             | NULL
3  | Curious Incident Of A Dog In The Night Time     | Drama

Я хочу выбрать all элементы из таблицы Elements и установить поле жанра в Драма или null.

Я пытаюсь сделать это в MySQL.

Заранее благодарю

4b9b3361

Ответ 1

Это возможно с помощью этого небольшого трюка (OUTER JOIN в таблице "многие ко многим" с ограничением на то, что для параметра GroupID должно быть 3 (для драмы)

http://sqlfiddle.com/#!2/b7c18/2

SELECT elements.ID, elements.Element, groups.Genre
  FROM elements
LEFT OUTER JOIN group_elements
  ON elements.ID = group_elements.ElementID
 AND group_elements.GroupID = 3
LEFT OUTER JOIN groups
  ON group_elements.GroupID = groups.ID

LEFT OUTER JOIN означает: возьмите все строки из предшествующих таблиц (те, которые находятся на стороне LEFT стороны LEFT OUTER JOIN, если вы это сделаете), даже если нет соответствующих ей строк в следующих таблицах, Условие ON elements.ID = group_elements.ElementID AND group_elements.GroupID = 3 говорит, что если мы найдем что-либо, что соответствует нашему ElementID, оно также должно быть драмой (GroupID = 3). Затем мы делаем другую LEFT OUTER JOIN в таблице групп, которая позволяет нам отображать столбец Genre или NULL, если этот элемент не был драмой.