2009-06-21 42 views
2

也許我有一個非常糟糕的一天之間的記錄,但可能有人可能會幫助我把這個:SQL分組:最近用戶

MessageID | SendingUserID | ReceivingUserID 
------------------------------------------- 
1073  | 1002   | 1001 
1065  | 1001   | 1002 
1076  | 1008   | 1002 

分爲:

MessageID | SendingUserID | ReceivingUserID 
------------------------------------------- 
1073  | 1002   | 1001 
1076  | 1008   | 1002 

藉此,只列出兩個用戶之間最近的消息?

回答

0

試試這個:

SELECT Message.* 
FROM Message 
WHERE Message.MessageID IN 
(SELECT MAX(MessageID) FROM Message 
    GROUP BY 
     CASE WHEN ReceivingUserID > SendingUserID 
      THEN ReceivingUserID ELSE SendingUserID END, 
     CASE WHEN ReceivingUserID > SendingUserID 
      THEN SendingUserID ELSE ReceivingUserID END 
) 
+0

更新爲匹配「兩用戶之間」要求; @unknown:如果沒有聚合且沒有GroupBy,則無法選擇SendingUserID – devio 2009-06-21 11:51:46

0

獨特的自連接方式:

select * 
from YourTable a 
left join YourTable b 
    on (
     (a.SendingUserID = b.SendingUserID 
     and a.ReceivinggUserID = b.ReceivingUserID) 
     or (a.SendingUserID = b.ReceivingUserID 
     and a.ReceivinggUserID = b.SendingUserID) 
    ) and b.messageid > a.messageid 
where b.messageid is null 

上同用戶之間的消息後 「b」 的搜索的加入。 WHERE子句篩選沒有更新消息的消息。這樣只會爲您提供每對用戶之間的最新消息。

0

你可以在SQL Server中使用CTE(公共表表達式)2005及更高,以確保這兩個用戶名的總是前的較小的一個較大的一個,然後就得到最大的爲每個組合:

WITH Messages(MessageID, User1, User2) 
AS 
(
    SELECT 
     MessageID, 
     CASE 
      WHEN SendingUserID < ReceivingUserID 
      THEN SendingUserID 
      ELSE ReceivingUserID 
     END as 'User1', 
     CASE 
      WHEN SendingUserID < ReceivingUserID 
      THEN ReceivingUserID 
      ELSE SendingUserID 
     END as 'User2' 
    FROM 
     MyMessages 
) 
SELECT 
    MessageID, User1, User2 
FROM 
    Messages m1 
WHERE 
    MessageID = (SELECT MAX(MessageID) FROM Messages m2 
       WHERE m1.User1 = m2.User1 AND m1.User2 = m2.User2) 

內SELECT的CTE內將「訂單」這樣的郵件:在此基礎上CTE

MessageID User1 User2 
    1065  1001 1002 
    1073  1001 1002 
    1076  1002 1008 

和外SELECT然後只是簡單的選取具有最大MessageID COM中的條目每(User1,User2)的組合。

Marc