0

我有两个这样的表:

USER
id
name

MESSAGE
id
sender_id
receiver_id

如您所想,这些表之间有两个一对多的关系。

在我的后端,我有过滤器来搜索与用户关联的消息。按下“过滤器”后,我应该显示与他/她关联的消息列表,在名为“发送者/接收者”的列中显示一个指定该人是消息的发送者还是接收者(或什至两者)的列.

我的疑问:我还必须提供在“发件人/收件人”列的基础上订购列表的可能性。你知道,按下“Sender/Receiver”列标题将首先显示用户是“Sender”的消息,然后是“Both”的位置,最后是“Receiver”的位置。再次按下将显示用户是“Receiver”的消息,然后是“Both”的位置,然后是“Sender”的位置。

什么样的 SQL 可以进行这种排序?

注意:我提出的模式不是强制性的。如有必要,请提出另一个。

4

2 回答 2

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]
于 2012-08-28T20:02:59.853 回答
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
         )

order by 查看您对发送者和接收者感兴趣的用户,然后根据您的约束执行一些逻辑来确定顺序(首先发送,然后同时发送,然后是接收者)。

于 2012-08-28T20:04:46.187 回答