2016-07-30 45 views
1

我正在使用聊天系統,需要爲用戶1119獲取收件箱數據。此查詢應返回每個對話的最後一條消息。SQL&LINQ - 與2列和「反轉值」相差

發送消息實體由發送者ID(CreateUserId),接收機ID(用戶ID),日期(CREATEDATE)和消息文本(商品說明)

編輯的:一個「對話」是之間發送一組消息兩個用戶。例如,如果用戶是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來實現這一點,所以使用也非常歡迎的解決方案!

+0

用樣本數據和期望結果編輯您的問題。什麼是談話? –

回答

0

我打算假設「對話」只是兩個特定人之間的信息。這似乎接近你的查詢。

你不能真正做你想要的聚合。因爲消息列的「最大值」可能不是最大日期/時間。相反,使用窗口功能:

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。