我有一个情况,我们有一个包含所有项目的表,如果该项目已售出,它在另一个表中有一个条目。
我正在尝试退回所有未售出的商品,但它似乎不起作用。
我有这个 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 为空
。
然而,它似乎仍然返回与我离开时相同数量的行 AND w.winner_id IS NULL
。
最佳答案
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
(注意功能差异,结果不一样,因为查询在功能上不等价)
关于mysql - 使用 LEFT JOIN 返回不匹配的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25095284/