2

也许我今天过得很糟糕,但有人可以帮我扭转这个局面:

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

进入:

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

因此,仅列出两个用户之间的最新消息?

4

3 回答 3

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
)
于 2009-06-21T11:45:17.973 回答
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 子句过滤没有后续消息的消息。这只会为您提供每对用户之间的最新消息。

于 2009-06-21T11:56:14.740 回答
0

您可以在 SQL Server 2005 及更高版本中使用 CTE(公用表表达式)来确保两个 UserID 始终是较小的,然后是较大的,然后为每个组合获取最大值:

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)

CTE 内部的 SELECT 会像这样“排序”您的消息:

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

and the outer SELECT based on this CTE then just simply picks the entry with the maximum MessageID for every combination of (User1, User2).

Marc

于 2009-06-21T13:17:37.493 回答