左外连接条件

时间:2013-03-14 08:59:23

标签: sql postgresql

我(我认为)SQL的问题非常简单。 我有两张桌子: 帖子(id,body,user_id)和Reports(id,user_id,post_id)。

我想显示给定用户的所有帖子,但他没有将其标记为已报告。

我构建这样的查询:

Select * FROM posts LEFT OUTER JOIN 
reports ON reports.post_id = posts.id WHERE reports.id IS NULL

然而,它需要所有报告,而不仅仅是我的用户添加的报告。当然添加Where reports.id IS NULL AND reports.user_id = 123将无效......是否有任何解决方案,或者我应该进行子查询?

顺便说一句:我不认为这会有什么不同,但我正在运行postgres 9.x

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

reports.user_id = 123添加到加入条件,而不是where子句。这只会在reportsuser_id = 123上加入,并且只删除那些匹配项:

SELECT *
FROM posts
LEFT OUTER JOIN reports ON reports.post_id = posts.id
    AND reports.user_id = 123
WHERE reports.id IS NULL

或者,使用WHERE NOT EXISTS

SELECT *
FROM posts
WHERE NOT EXISTS
(
    SELECT 1
    FROM reports 
    WHERE reports.post_id = posts.id
    AND reports.user_id = 123
)