0

次のような 2 つのテーブルがあります。

USER
id
name

MESSAGE
id
sender_id
receiver_id

ご想像のとおり、これらのテーブル間には 1 対多の関係が 2 つあります。

私のバックエンドには、ユーザーに関連付けられたメッセージを検索するフィルターがあります。「フィルター」を押した後、その人に関連付けられたメッセージのリストを表示し、「送信者/受信者」という列に、その人がメッセージの送信者または受信者 (あるいはその両方) であったかどうかを示す列を表示する必要があります。 .

私の疑問:「送信者/受信者」列のベースでリストを注文する可能性も与えなければなりません。「送信者/受信者」列ヘッダーを押すと、最初にユーザーが「送信者」、次に「両方」、最後に「受信者」のメッセージが表示されます。もう一度押すと、ユーザーが「受信者」、次に「両方」、次に「送信者」のメッセージが表示されます。

その順序付けを行うことができる 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

派手な order by ステートメントが必要なだけです。

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 に答える