我正在使用聊天系统,需要获取用户1119的收件箱数据。此查询应返回每个会话中的最后一条消息。
消息实体由发件人ID(CreateUserId),接收者ID(UserId),日期(CreateDate)和消息文本(Desc)组成
编辑:A"对话"是两个用户之间发送的一组消息。例如,如果用户是1119和1120,则会话中的消息是CreateUserId = 1119,UserId = 1120或CreateUserId = 1120,UserId = 1119的消息。
当前查询如下所示:
SELECT MAX(Id) Id, CreateUserId Sender,
UserId Receiver, MAX(CreateDate) Date, MAX([Desc]) Message
FROM [CarSharing].[dbo].[Message]
WHERE CreateUserId = 1119 OR UserId = 1119
GROUP BY CreateUserId, UserId)
最终,我想用LINQ实现这一点,所以使用它的解决方案也非常受欢迎!
答案 0 :(得分:0)
我将假设“对话”只是两个特定人之间的信息。这似乎与您的查询近似。
你无法通过聚合真正做到你想要的。因为消息列的“max”可能不是最大日期/时间。相反,使用窗口函数:
SELECT m.*
FROM (SELECT m.*,
ROW_NUMBER() OVER (ORDER BY CreateDate DESC, id DESC) as seqnum
FROM [CarSharing].[dbo].[Message] m
WHERE 1119 IN (m.CreateUserId, UserId)
) m
WHERE seqnum = 1;
然而,窗口子句中的ORDER BY
应该定义顺序。这是猜测创建日期是第一个,然后是id。