MYSQL - 从每个对话中获取最后一条消息?

问题描述 投票:0回答:1

我看到之前有人问过一些问题,但答案对这个案例不起作用。

表用户

身份证 姓名
1 A
2 B
3 C

Chat
表包含像这样的双日志消息,其中第1面来自发送者视角,第2面来自接收者视角:

身份证 发件人ID 接收者ID 留言 侧面 创建日期
34c1de57-11ba-4d34-b5a3-9e6a5511223b 1 2 你好 1 2015-12-08 20:00
3c2c8aae-fd08-4879-96fb-6ac1c75d6b28 2 1 你好 2 2015-12-08 20:01
60f91e53-7b8c-4cac-a394-e613fe39bcef 3 1 谢谢 1 2015-12-09 20:00
d74fa5f0-eb2c-4c32-9066-80e11e6160b9 1 3 谢谢 2 2015-12-09 20:01

小提琴

给定一个用户 ID(即:1),我需要结果如下所示:

姓名 侧面 留言
C 2 谢谢
B 1 你好

我该怎么做?

sql mysql
1个回答
0
投票

问题文本和示例结果之间存在冲突。

问题文本表示显示每个对话中最新 ID 的行。但示例结果优先考虑 ID 是发件人的情况。

如果样本结果正确,您想要这个:

WITH numbered As
(
    SELECT *
       , row_number() over (partition by SenderId, RecieverId order by CreatedDate Desc) rn
    FROM Chat
    WHERE SenderId = @Id
)
SELECT U.Name, n.Side, n.Message
FROM numbered n
INNER JOIN User u ON u.Id = n.ReceieverId

如果问题文本正确,您想要这个:

WITH numbered as (
    select *,
        case when senderId = @id then ReceiverId else senderId end PartnerId,
        row_number() over (partition by least(senderId, receiverId), greatest(senderId, receiverId) order by createdDate desc) rn
    from Chat
    where @Id IN (senderId, receiverId)
)
SELECT u.Name, n.Side, n.Message
FROM numbered n
INNER JOIN User u on u.Id = n.PartnerId
WHERE n.rn =  1
© www.soinside.com 2019 - 2024. All rights reserved.