为什么在LEFT JOIN中忽略WHERE条件?

时间:2014-04-03 22:23:51

标签: mysql sql left-join

我遇到了使用WHERE子句限制左结果集的问题,即使我在形成正确结果集的子查询中添加了相同的条件。这是一个例子:

SELECT shareItems.*, likes FROM shareItems LEFT JOIN
   (SELECT users_X_shareItems.itemID, COUNT(users_X_shareItems.userID) AS 'likes'
    FROM users_X_shareItems, shareItems WHERE shareItems.itemType = 2 AND
    users_X_shareItems.liked = 1
    GROUP BY users_X_shareItems.itemID) AS likeTable
ON shareItems.itemID = likeTable.itemID AND shareItems.itemType = 2

尽管我在两个查询中都指定了shareItems.itemType = 2,但它被忽略了。谁知道为什么?感谢。

2 个答案:

答案 0 :(得分:5)

如果要限制LEFT JOIN的左侧,则需要将条件设置为WHERE,而不是JOIN(仅限制右侧):

 ON shareItems.itemID = likeTable.itemID
 WHERE shareItems.itemType = 2

答案 1 :(得分:1)

它们不被忽略,它们被应用在连接内侧的记录中,外表中没有匹配的记录已被添加到结果集中。
因为谓词是连接的一部分,它作为连接的一部分应用,然后在那之后,所有记录形成内部,没有匹配的内容被添加回来。因为没有匹配,外部的谓词那边不能(根据OUTRER的定义, 不能 )。 所有这些记录,因为外表中没有匹配,当然在任何应该来自该表的属性中都有空值,因此无论如何都不能在该点应用谓词。

将谓词条件移动到WHERE子句,然后它将在外连接之后应用,并且将执行您想要的操作。