1

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

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

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'
4

2 回答 2

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'

一个 SQLfiddle,由 @hims056 提供

于 2013-05-25T06:29:45.153 回答
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 子句可能包含与键无关的条件,这似乎是一个鲜为人知的事实。

于 2013-05-25T06:29:39.917 回答