2012-08-28 55 views
0

我有兩個表像這樣:用戶和消息:如何通過發件人,收件人或兩者訂購?

USER 
id 
name 

MESSAGE 
id 
sender_id 
receiver_id 

如你想,有兩個這些表之間的一個一對多的關係。

在我的後端,我有過濾器來搜索與用戶關聯的消息。在按下「過濾器」後,我應該顯示與他/她相關的消息列表,顯示一列指定該人是發送者還是接收者(或甚至兩者)的消息在名爲「發送者/接收者」的列中。

我的疑問:我也有可能在「發送者/接收者」列的基礎上訂購這個列表。您知道,按「發件人/接收人」列標題將首先顯示用戶是「發件人」的消息,然後是「兩者」,最後是「接收者」的位置。再次按下將顯示用戶是「Receiver」的消息,然後「Both」和「Sender」在哪裏。

什麼樣的SQL可以做那種排序?

注:我提出的模式不是強制性的。如果有必要提出另一個。

回答

1
ORDER 
    BY CASE WHEN sender_id = [user-ID of interest] 
      AND receiver_id = [user-ID of interest] 
      THEN 2  -- is both sender & receiver 
      WHEN sender_id = [user-ID of interest] 
      THEN 1  -- is only sender 
      ELSE 3  -- is only receiver 
     END, 
     [other conditions to sort by] 
0

您只需通過聲明需要一個花哨的順序:

select m.* 
from message m join 
    user s 
    on u.sender_id = s.id join 
    user r 
    on u.receive_id = r.id 
where s.id = <user> or r.id = <user> 
order by (case when s.id = <user> and r.id <> <user> then 0 
       when s.id = <user> and r.id = <user> then 1 
       when r.id = <user> then 2 
       else 3 -- shouldn't happen 
     ) 

的看着你感興趣的發送者和接收者,然後將用戶的順序做了一些邏輯來確定按照順序到你的約束(先發送,然後是兩者,然後是接收器)。

相關問題