SQL JOIN多对多

Mar*_*šak 26 mysql sql many-to-many join

对简约标题感到抱歉,但我不知道如何描述它.我有三张桌子:

组表

ID | Genre
-----------------
1  | Action
2  | Adventure
3  | Drama
Run Code Online (Sandbox Code Playgroud)

很多很多桌子

GroupID | ElementID
-----------------
    3   |    1
    1   |    2
    2   |    2
    2   |    3
    3   |    3
Run Code Online (Sandbox Code Playgroud)

和元素表

ID | Element
-----------------
1  | Pride and Prejudice
2  | Alice in Wonderland
3  | Curious Incident Of A Dog In The Night Time
Run Code Online (Sandbox Code Playgroud)

一切都很好,非常简单.我想要实现的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
Run Code Online (Sandbox Code Playgroud)

我想从表Elements中选择所有元素,并将类型字段设置为Dramanull.

我试图在MySQL中这样做.

先感谢您

Mik*_*ert 22

使用这个小技巧(在多对多表上进行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
Run Code Online (Sandbox Code Playgroud)

LEFT OUTER JOIN意思是:从下面的表格中取出所有线条(LEFT OUTER JOIN如果你愿意的话,在左手边的那些线条上),即使下表中没有与它们对应的线条.条件ON elements.ID = group_elements.ElementID AND group_elements.GroupID = 3说如果我们发现任何与我们的ElementID匹配的东西,它也必须是戏剧(GroupID = 3).然后我们在groups表上执行另一个LEFT OUTER JOIN,这使我们能够显示Genre列,如果元素不是戏剧,则为NULL.

  • 我的回复回答了这个问题的需要,该问题要求在图书类型(假设这些是图书)未知时显示 NULL 值。当您想查看查询中的一个表中的_所有_数据时,无论其他地方是否有任何相关数据,带外连接的查询都非常有用。例如,上面的查询在管理图书收藏的应用程序中可能很有用:它可以让您查看所有图书并识别尚未标记类型的图书。查看带有**标签的书籍的类型可以帮助您决定另一本书的类型。 (2认同)