Frage

Vielleicht habe ich einen wirklich schlechten Tag, aber könnte mir jemand helfen, dies zu drehen:

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

Hinein:

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

Wo ist nur die neueste Nachricht zwischen zwei Benutzern aufgeführt?

War es hilfreich?

Lösung

Versuche dies:

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
)

Andere Tipps

Der exklusive Selbstansatz:

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

Der Join auf "B" sucht nach späteren Nachrichten zwischen denselben Benutzern. Die Where -Klausel filtert nach Nachrichten, die keine spätere Nachricht haben. Dies gibt Ihnen nur die neueste Nachricht zwischen jedem Benutzerpaar.

Sie können einen CTE (Common Table Expression) in SQL Server 2005 und höher verwenden, um sicherzustellen, dass die beiden Benutzer -ID immer die kleinere vor dem größeren sind, und erhalten dann nur das Maximum für jede dieser Kombinationen:

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)

Die innere Auswahl im CTE würde Ihre Nachrichten wie diese "bestellen":

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

und die äußere SELECT Basierend auf diesem CTE wählt dann einfach den Eintrag mit dem Maximum aus MessageID Für jede Kombination von (user1, user2).

Marc

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top