2

多分私は本当に悪い日を過ごしていますが、誰かがこれを変えるのを手伝ってくれるでしょうか:

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

の中へ:

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

これにより、2 人のユーザー間の最新のメッセージのみが一覧表示されますか?

4

3 に答える 3

0

SQL Server 2005以降でCTE(共通テーブル式)を使用して、2つの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

そして、このCTEに基づくアウターは、(User1、User2)のすべての組み合わせに対してSELECT最大のエントリを選択するだけです。MessageID

マーク

于 2009-06-21T13:17:37.493 に答える
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 に答える