想要从查询中排除一些记录,但我不知道如何

时间:2011-07-11 13:34:53

标签: sql ruby-on-rails postgresql inner-join outer-join

我有三张这样的表:

messages
user_id | message
2       | 'foo'
3       | 'bar'

blacklists
user_id | blacklister_id
1       | 2

users
id      | name
1       | 'me'
2       | 'blacklister'
3       | 'my friend'

我是 - 来自表用户的id为1的用户。我不希望看到我添加到黑名单的用户的消息(我在黑名单中添加了ID为2的用户)。 如何在一个查询中显示没有来自黑名单用户(带有user_id:2)的消息的消息?

现在我在Rails中这样做了:

  @all_messages = Message.all
  @filter_messages = Array.new
  for message in @all_messages
    @blacklist = Blacklist.where("user_id = ? and blacklister_id = ?",current_user.id,message.user_id).first
    if @blacklist.nil?
      @messages << message
    end  
  end
  return @messages

这真的很糟糕,我想知道如何用一个postgresql查询重构这个。

1 个答案:

答案 0 :(得分:2)

select *
from messages m
inner join users u on m.user_id = u.id
left outer join blacklists b on u.id = b.user_id
where b.user_id is null