postgres:使用join过滤掉一些结果

时间:2013-02-07 11:04:35

标签: sql postgresql

我正在尝试构建SQL查询(我正在运行postgres),这会过滤掉一些帖子:

让我们说,我有用户模型(id,名称等等),黑名单模型(带id,user_id,blacklisted_user_id)nad Post模型(id,author_id,title等)

想象一下,用户A(id = 5)阻止用户B(id = 10)。

用户A和B都不应该看到他们的帖子。 我正在尝试查询看起来......像这样:

SELECT posts.* FROM "posts" 
LEFT JOIN blacklists b ON (b.user_id = posts.author_id OR 
                           b.blacklisted_user_id = posts.author_id)
WHERE (b.user_id = 5 AND b.blacklisted_user_id = posts.author_id) OR
      (b.user_id = posts.author_id AND b.blacklisted_user_id = 5)

然而,结果与我需要的完全相反:我只收到黑名单用户的帖子。

当我使用b.user_id != 5时,我的回复是空的。

1 个答案:

答案 0 :(得分:1)

你正在重复blacklisted_user_id = posts.author_id,这是不必要的。

然后,您可能想要与黑名单不匹配的帖子。类似的东西:

SELECT posts.* FROM posts 
LEFT JOIN blacklists b ON (b.user_id = posts.author_id OR 
                           b.blacklisted_user_id = posts.author_id)
WHERE posts.author_id = 5 AND b.user_id IS NULL

这是你想要的那种吗?