SQL& LINQ - 区分2列和#34;反转值"

时间:2016-07-30 14:26:48

标签: sql sql-server linq

我正在使用聊天系统,需要获取用户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)

THE ISSUE: The result gives out two messages from the same person, as the sender and receiver ids are switched. The row with the id 124 shouldn't be there

最终,我想用LINQ实现这一点,所以使用它的解决方案也非常受欢迎!

1 个答案:

答案 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。