0

ユーザー、リクエスト、メッセージの 3 つのテーブルがあります。android/iosメッセージアプリの起動時に表示されるスレッドリストのようなものを取得したいと思います。

ユーザー

id ユーザー名
1a
2b
3c

リクエスト

ID
1
2
3

メッセージ

Id request_id sender_id receiver_id メッセージのタイムスタンプ
1 1 1 2 asd 2013-06-10 06:45
2 1 1 3 自衛隊 2013-06-10 06:42
3 2 1 1 DFG 2013-06-10 06:41
4 2 1 2 fgh 2013-06-11 06:40
5 2 1 2 ghj 2013-06-12 07:45
6 2 2 1 jkl 2013-06-10 06:45
7 3 3 1 zxc 2013-06-10 03:45
8 3 3 1 xcv 2013-06-10 05:45

私が取得したいのは、次のようなものです。

スレッド

request_id sender_name receiver_name last_message last_timestamp
1 ab asd 2013-06-10 06:45
1 ac自衛隊 2013-06-10 06:42
2 ab ghj 2013-06-12 07:45
2 aa dfg 2013-06-10 06:41
3 年頃 xcv 2013-06-10 05:45

ここで、request_id + sender_id + receiver_id は各行で一意であり、last_message、last_timestamp はメッセージ テーブルからの最新のエントリを示します。順序は last_timestamp の降順になります。このテーブルを取得するにはどうすればよいですか?

4

1 に答える 1

1

groupwise maximumが必要です。これはMessages、各グループの識別 (最大) タイムスタンプを識別するサブクエリにテーブルを結合することによって見つけることができます。

SELECT   Message.request_id,
         Sender.username   AS sender_name,
         Receiver.username AS receiver_name,
         Message.message   AS last_message,
         Message.timestamp AS last_timestamp
FROM     Message NATURAL JOIN (
           SELECT   request_id,
                    sender_id,
                    receiver_id,
                    MAX(timestamp) timestamp
           FROM     Message
           GROUP BY request_id, sender_id, receiver_id
         ) t
    JOIN User Sender   ON   Sender.id = Message.sender_id
    JOIN User Receiver ON Receiver.id = Message.receiver_id
ORDER BY Message.request_id, last_timestamp DESC

sqlfiddleで参照してください。

上記のコメントで強調されている理由により、結果セットの順序は質問で予想される順序とは異なることに注意してください。

「順序はlast_timestamp降順になります」と言いますが、特定の例では、メッセージ'ghj'(他のすべてのメッセージの 2 日後に送信されます) は、すべてのレコードの真ん中だけでなく、同じレコードのすべての真ん中にも表示されrequest_idます. 結果セットの希望する並べ替え順序を明確にしてください。

于 2013-09-17T15:09:03.773 に答える