0

我有三个表:用户、请求和消息。我想获得类似 android/ios 消息应用程序在启动时显示的线程列表。

用户

id 用户名
1个
2 乙
3℃

要求

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 交流自卫队 2013-06-10 06:42
2 ab ghj 2013-06-12 07:45
2 aa dfg 2013-06-10 06:41
3 ca 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'(在所有其他消息之后两天发送)不仅出现在所有记录的中间,而且还出现在所有具有相同记录的request_id中间. 请澄清结果集的所需排序顺序?

于 2013-09-17T15:09:03.773 回答