我遇到了使用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,但它被忽略了。谁知道为什么?感谢。
答案 0 :(得分:5)
如果要限制LEFT JOIN的左侧,则需要将条件设置为WHERE,而不是JOIN(仅限制右侧):
ON shareItems.itemID = likeTable.itemID
WHERE shareItems.itemType = 2
答案 1 :(得分:1)
它们不被忽略,它们被应用在连接内侧的记录中,外表中没有匹配的记录已被添加到结果集中。
因为谓词是连接的一部分,它作为连接的一部分应用,然后在那之后,所有记录形成内部,没有匹配的内容被添加回来。因为没有匹配,外部的谓词那边不能(根据OUTRER的定义, 不能 )。
所有这些记录,因为外表中没有匹配,当然在任何应该来自该表的属性中都有空值,因此无论如何都不能在该点应用谓词。
将谓词条件移动到WHERE子句,然后它将在外连接之后应用,并且将执行您想要的操作。