使用LEFT JOIN返回没有匹配项的行

时间:2014-08-02 13:00:20

标签: mysql sql left-join

我的情况是我们有一个包含所有项目的表格,如果该项目已售出,则在另一个表格中有一个条目。

我正在尝试获取已退出的所有商品,但它似乎无效。

我有这个SQL:

SELECT a.auction_id FROM auctions AS a 
LEFT JOIN winners AS w ON a.auction_id=w.auction_id AND w.winner_id IS NULL
WHERE a.owner_id=1234567 AND a.is_draft=0 AND a.creation_in_progress=0;

我认为这只会返回auctions表中winners表中没有匹配条目的项目,因为我正在进行AND w.winner_id IS NULL

然而,它似乎仍然返回与我离开AND w.winner_id IS NULL时相同的行数。

1 个答案:

答案 0 :(得分:3)

SELECT a.auction_id
  FROM auctions AS a
  LEFT JOIN winners AS w
    ON a.auction_id = w.auction_id
 WHERE a.owner_id = 1234567
   AND a.is_draft = 0
   AND a.creation_in_progress = 0
   AND w.winner_id IS NULL

这属于WHERE子句:

   AND w.winner_id IS NULL

当您想要允许空值时,外部联接表的条件属于ON子句。在这种情况下,如果要对空值进行过滤,则将该标准放入WHERE子句中。 ON子句中的所有内容都旨在允许空值。

以下是一些使用我不久前回答的问题数据的例子:

正确使用x为null的地方: http://sqlfiddle.com/#!2/8936b5/2/0

同样的事情,但不正确地将该标准放入ON子句: http://sqlfiddle.com/#!2/8936b5/3/0

(注意FUNCTIONAL差异,结果不一样,因为查询在功能上并不相同)