2013-07-21 44 views
15

对不起,关于minimalistic标题,但我不知道如何描述它。我有三个表: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 

我想选择所有的从表元素的元素和流派字段设置为戏剧

我正在试图在MySQL中这样做。

预先感谢您

回答

15

这有可能与这个小窍门(OUTER JOIN的许多一对多表,以约束该群ID必须是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 OUTER JOIN的左手侧的,如果你愿意)的线,即使有相应于他们在FOLL没有台词欠款表。条件ON elements.ID = group_elements.ElementID AND group_elements.GroupID = 3表示如果我们发现任何与我们的ElementID相匹配的东西,它也必须是戏剧(GroupID = 3)。然后,我们在组表上创建另一个LEFT OUTER JOIN,这使我们能够显示流派列,或者如果元素不是戏剧,则显示NULL。

+0

我看不到需要返回NULL列。为什么不使用WHERE groups.ID!='3'什么的。 bisides,当运行你在Mysql 5.6中摆弄它时,它将以不同的顺序返回!首先是非NULL列,而不是NULL列。 http://sqlfiddle.com/#!9/01cf3/1/0你可以使用ORDER BY语句。 –

+1

我的答复回答了这个问题的需要,当书的类型(假设这些书是书本)未知时,需要显示NULL值。当您想查看查询中某个表的数据时,使用外部连接的查询非常有用,而不管其他地方是否有任何相关数据。例如,上述查询在管理图书集的应用程序中可能非常有用:它可让您查看所有图书并识别尚未用流派标记的图书。看到**标记为**的书籍的流派可以帮助您决定另一本书的流派。 –