我有两张桌子:帖子和评论。一篇文章有很多评论。
我经常要检索所有帖子以及他们可能有的任何评论。我使用左连接执行此操作,如下所示:
select p.post_id, p.content_status, p.post_title, c.comment_id,
c.content_status as comment_status
from post p
left join comment c on p.post_id = c.post
现在我想要排除状态不是“已批准”的任何帖子或评论。我可以约束帖子表没有问题,仍然返回没有评论的帖子。一旦我约束了评论表,我就不再检索没有评论的帖子了。
以下是违规查询:
select p.post_id, p.content_status, p.post_title, c.comment_id,
c.content_status as comment_status
from post p
left join comment c on p.post_id = c.post
where p.content_status = 'Approved' and c.content_status = 'Approved'
答案 0 :(得分:4)
只需将右侧表格中的条件移动到ON
子句中即可。
WHERE
子句中的任何条件都将完全删除行,而ON
子句中的条件将 - 根据需要 - 不删除行但只是阻止匹配。
SELECT p.post_id, p.content_status, p.post_title, c.comment_id,
c.content_status AS comment_status
FROM post p
LEFT JOIN comment c
ON p.post_id = c.post AND c.content_status = 'Approved'
WHERE p.content_status = 'Approved'
答案 1 :(得分:2)
将左连接表上的条件移动到连接条件:
select p.post_id, p.content_status, p.post_title, c.comment_id, c.content_status as comment_status
from post p
left join comment c
on p.post_id = c.post
and c.content_status = 'Approved'
where p.content_status = 'Approved'
似乎是一个鲜为人知的事实,JOIN的ON子句可能包含非关键的相关条件。