2014-05-04 50 views
1

我得到的消息表(簡體):分組不同的列的查詢

MessageId, 
FromUserId, 
ToUserId, 
Text 

,並希望進行查詢輸出作爲聊天列表如下:

LastMessageId, 
UserId, 
Text 

所以基本上創建一個將FromUserId和ToUserId分組的查詢,但前提是其中一個是我自己的userId。

於是我想出了這一點:

SELECT (MessageId) 
     ,(Text) 
     ,(FromUserId) 
     ,(ToUserId) 
    FROM [Messages] a 
    inner join (select FromUserId as FromId, ToUserId as ToId, Max(MessageId) as MaxId from Messages where MessageId > 0 group by FromUserId, ToUserId) as b on 
    a.MessageId = b.MaxId 
    join users u on FromUserId = u.userId 
    where ToUserId = 123 or FromUserId = 123 

有了這個,我有一半的路該輸出(說123是我的用戶ID):

MessageId, Text, FromUserId, ToUserId 
1   bla 123   345 
2   bla2 345   123 
3   bla3 678   123 
4   bla4 123   678 

我想有一個這樣的輸出:

MessageId, Text, UserId 
2   bla2 345 
4   bla4 678 

所以我忽略自己的用戶ID和只有每次談話的最後一條消息。

這可以在1個查詢中完成嗎?到現在爲止,我只是獲取所有的消息,並通過代碼處理這些消息。

+0

你如何定義 「對話」?請注意,通常不應該依賴於ID的順序,而是使用日期/時間/時間戳列(而不是在本質上是日誌,但是在任何時候「何時」可以改變)的問題 - ID應該被認爲是無價值的。 –

回答

1
SELECT * FROM messages WHERE MessageId IN 
(
    SELECT DISTINCT 
    CASE WHEN m2.MessageId IS NULL THEN m1.MessageId 
    WHEN m1.MessageId > m2.MessageId THEN m1.MessageId ELSE m2.MessageId END 
    FROM messages m1 
    LEFT JOIN messages m2 ON 
    (m1.FROMUSERID = m2.ToUserId 
    AND m2.FROMUSERID = m1.ToUserId 
    AND m1.MessageId != m2.MessageId) 
) 
-- AND (messages.FROMUSERID = 123 or messages.ToUserId = 123) 

Sqlfiddle Demo

+0

最後我做了類似的情況(時),無論如何。 –

+0

歡迎您朋友。 –

0

這是一種方法,首先將消息表與UserId以及其他信息組合在一起。然後使用row_number()功能找到最近的每個用戶信息,並選擇使用segnum = 1

SELECT MessageId, Text, UserId 
FROM (SELECT MessageId, Text, UserId, 
      row_number() over (partition by UserId order by MessageId desc) as seqnum 
     FROM ((select FromUserId as UserId, MessageId, Text 
      Messages m 
      ) union all 
      (select ToUserId as UserId, MessageId, Text 
      Messages m 
      ) 
      ) m 
    ) m 
WHERE seqnum = 1; 

如果要將此限制爲一個用戶,你可以添加where FromUserId = @X or ToUserId = @X到每個子查詢(更好地做到這一點在union all之前)。

+0

雖然OP似乎想要每個用戶多行,他希望每次會話都是最近的一次(比如電子郵件系統傾向於顯示它,我想)。 –