【问题标题】:How to join tables so even rows with no matches are included?如何连接表,以便包含不匹配的行?
【发布时间】:2014-08-20 04:05:17
【问题描述】:

我正在尝试将人员加入到衬衫表中,结果显示所有人员和衬衫都是蓝色的。

这是我的人:

ID  NAME
1   Antonio Paz
2   Lilliana Angelovska
3   Michael SpringRoll
4   Poor dude

还有衬衫:

ID  STYLE   COLOR   OWNER
1   polo    blue    1
2   dress   white   1
3   tshirt  blue    1
4   dress   orange  2
5   polo    red     2
6   dress   blue    2
7   tshirt  white   2
8   dress   orange  3
9   polo    red     3
10  dress   red     3
11  tshirt  white   3

我正在做包括所有人和所有衬衫的左外连接:

SELECT p.name,s.style,s.color FROM person p LEFT OUTER JOIN shirt s
   ON s.owner = p.id

NAME                    STYLE   COLOR
Antonio Paz             polo    blue
Antonio Paz             dress   white
Antonio Paz             t-shirt blue
Lilliana Angelovska     dress   orange
Lilliana Angelovska     polo    red
Lilliana Angelovska     dress   blue
Lilliana Angelovska     t-shirt white
Michael SpringRoll      dress   orange
Michael SpringRoll      polo    red
Michael SpringRoll      dress   red
Michael SpringRoll      t-shirt white
Poor dude               (null)  (null)

如何限制查询以便只显示蓝色衬衫但还包括空行的人,以便结果如下所示:

NAME                    STYLE   COLOR
Antonio Paz             polo    blue
Antonio Paz             t-shirt blue
Lilliana Angelovska     dress   blue
Michael SpringRoll      (null)  (null)
Poor dude               (null)  (null)

您可以在此处运行我的示例: http://sqlfiddle.com/#!2/1f440/1/0

非常感谢您的帮助!

【问题讨论】:

    标签: mysql sql sqlfiddle


    【解决方案1】:

    让它成为左连接而不是内连接

    在 ON 中包含 s.color = 'blue',而不是在 WHERE 之后

    SELECT p.name,s.style FROM person p LEFT JOIN shirt s
       ON s.owner = p.id AND s.color = 'blue'; 
    

    【讨论】:

    • 我没有看到任何反对意见,所以我想一切都很好;)
    • 不需要运行它——我错过了“左连接”中的“左”——我认为它是一个内连接。无论如何,现在一切都很好。我们可以删除所有的 cmets,干杯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 2018-01-23
    • 1970-01-01
    • 2011-09-30
    相关资源
    最近更新 更多