2011-07-11 41 views
2

有三个表是这样的:想从查询中排除一些记录,但是我不知道我怎么

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的查询重构这个。

回答

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 
+0

我加了“m”。它工作正常!非常感谢! 选择m。* 来自消息m 内部加入用户u对m.user_id = u.id 左外部联接黑名单b对u.id = b.user_id 其中b.user_id为null – Yud

相关问题