【问题标题】:MySQL select statement involving join涉及连接的 MySQL 选择语句
【发布时间】:2016-04-05 11:06:39
【问题描述】:

我有两张桌子,a 和 b

表一

--------------------
|id  |  item       |
--------------------
|1   |  apple      |
--------------------
|2   |  orange     |
--------------------
|3   |  mango      |
--------------------
|4   |  grapes     |
--------------------
|5   |  plum       |
--------------------
|6   |  papaya     |
--------------------
|7   |  banana     |
--------------------

表b

----------------------------
user_id | item_id | price  |
----------------------------
32      | 3       | 250    |
----------------------------
32      | 6       | 180    |
----------------------------
32      | 2       | 120    |
----------------------------

现在我想加入 MySql 中的两个表,以便获得表 a 中所有水果的列表以及它们的价格,如用户 32 的表 b 中;像这样:

-----------------------------
|id  |  item       |  price  |
-----------------------------
|1   |  apple      |         |
-----------------------------
|2   |  orange     |   120   |
------------------------------
|3   |  mango      |   250   |
------------------------------
|4   |  grapes     |         |
------------------------------
|5   |  plum       |         |
------------------------------
|6   |  papaya     |   180   |
------------------------------
|7   |  banana     |         |
------------------------------

我能做的最好的就是:

SELECT      a.id, 
            a.item, 
            b.price 
FROM        a 
INNER JOIN  b   ON  a.id = b.item_id 
WHERE       b.user_id = 32

这只会给我已设置价格的行,而不是未设置价格的行。如何构建 SQL?

【问题讨论】:

  • 使用LEFT JOIN 代替INNER JOIN 并将WHERE 更改为AND
  • 使用 LEFT JOIN,也许您可​​以尝试sqlyog,它可以帮助您使用具有正确语法的查询生成器功能生成查询。
  • 不要修改问题中的查询以匹配答案。这样做会删除问题的原始含义并使所有已发布的答案无效。

标签: mysql sql select join left-join


【解决方案1】:

使用LEFT OUTER JOIN 代替INNER JOIN

试试这个:

SELECT a.id, a.item, b.price 
FROM a 
LEFT OUTER JOIN b ON a.id = b.item_id AND b.user_id = 32;

【讨论】:

    【解决方案2】:

    您必须改用 OUTER JOIN

    SELECT a.id, a.item, b.price 
    FROM a LEFT OUTER JOIN b ON a.id = b.item_id WHERE b.user_id = 32
    

    【讨论】:

    • 如果在 where 子句中传递 b.user_id = 32 则不会返回价格不可用的行
    • WHERE b.user_id = 32 部分将LEFT JOIN 还原为INNER JOIN。这应该在ON 子句中。
    【解决方案3】:

    您需要一个“LEFT”联接来确保返回左侧的所有记录,而不管右侧的相应值如何。

    SELECT a.id, a.item, b.price
    FROM a
    LEFT JOIN b ON a.id = b.item_id
    WHERE b.user_id = 32
    

    【讨论】:

    • 由于WHERE 子句,这仍然是一个INNER JOIN。该子句应该在ON
    猜你喜欢
    • 2012-01-13
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 2011-02-18
    • 2013-07-26
    • 1970-01-01
    • 2011-12-13
    • 2011-04-06
    相关资源
    最近更新 更多