2011-07-11 66 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

相關問題