Domanda

Forse sto passando una brutta giornata, ma qualcuno potrebbe forse aiutarmi a trasformare questo:

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

Into:

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

Per cui è elencato solo il messaggio più recente tra due utenti?

È stato utile?

Soluzione

prova questo:

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
)

Altri suggerimenti

L'approccio esclusivo di self join:

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

Il join su " b " cerca i messaggi successivi tra gli stessi utenti. La clausola WHERE filtra i messaggi che non hanno un messaggio successivo. Questo ti dà solo l'ultimo messaggio tra ogni coppia di utenti.

È possibile utilizzare un CTE (Common Table Expression) in SQL Server 2005 e versioni successive per assicurarsi che i due UserID siano sempre i più piccoli prima di quello più grande, e quindi ottengano il massimo per ciascuna di queste combinazioni:

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)

Il SELECT interno all'interno del CTE dovrebbe "ordinare" i tuoi messaggi in questo modo:

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

e il SELEZIONA esterno in base a questo CTE seleziona semplicemente la voce con il MessageID massimo per ogni combinazione di (Utente1, Utente2).

Marc

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top