如何在LEFT JOIN中约束右手表?

时间:2013-05-25 06:26:53

标签: mysql sql

我有两张桌子:帖子和评论。一篇文章有​​很多评论。

我经常要检索所有帖子以及他们可能有的任何评论。我使用左连接执行此操作,如下所示:

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'

2 个答案:

答案 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'

An SQLfiddle, courtesy of @hims056

答案 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子句可能包含非关键的相关条件。