【问题标题】:SQL JOIN many-to-manySQL JOIN 多对多
【发布时间】:2013-07-21 16:22:11
【问题描述】:

对不起,这个简约的标题,但我不知道如何简短地描述它。我有三张桌子:

组表

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

我想从元素表中选择所有元素并将流派字段设置为戏剧null

我正在尝试在 MySQL 中执行此操作。

提前谢谢你

【问题讨论】:

    标签: mysql sql join many-to-many


    【解决方案1】:

    这个小技巧是可能的(多对多表上的外部连接,约束条件是 GroupID 必须为 3(用于戏剧)

    http://sqlfiddle.com/#!9/01cf3/1

    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 的左侧),即使在下表中没有与它们对应的行.条件ON elements.ID = group_elements.ElementID AND group_elements.GroupID = 3 表示,如果我们找到任何与我们的 ElementID 匹配的东西,它也一定是戏剧(GroupID = 3)。然后,我们在 groups 表上执行另一个 LEFT OUTER JOIN,这使我们能够显示 Genre 列,如果元素不是戏剧,则为 NULL。

    【讨论】:

    • 我认为不需要返回 NULL 列。为什么不使用 WHERE groups.ID != '3' 或其他东西。但是,当你在 Mysql 5.6 中运行时,它会以不同的顺序返回!首先是非 NULL 列,然后是 NULL 列。 sqlfiddle.com/#!9/01cf3/1/0你可以使用 ORDER BY 语句。
    • 我的回复回答了问题的需要,它要求在不知道书籍类型(假设是书籍)时显示 NULL 值。当您想查看查询中的一个表中的所有数据时,无论其他地方是否有任何相关数据,使用外连接的查询都非常有用。例如,上面的查询在管理图书收藏的应用程序中可能很有用:它可以让您查看所有图书并识别您尚未标记类型的图书。查看带有标记的书籍的类型可以帮助您确定另一本书的类型。
    • 如果您有兴趣在结果中也获得 all 类型(就像我一样),您可以增加 TD_Nijbour 的查询以在您想要的值中也包含 GROUP_CONCAT一起,然后GROUP BY 将结果汇总到基本记录中。例如:sqlfiddle.com/#!9/036d49/2/0
    猜你喜欢
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 2021-03-27
    • 2011-03-03
    相关资源
    最近更新 更多