Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

gruppo sql agendo come la messaggistica di Facebook (mssql sp)

La risposta è simile al tuo domanda precedente . Tuttavia, ora, deve tenere conto che il @user potrebbe essere uno dei due utenti nel messaggio.

In questo caso, row_number() non è direttamente di aiuto.

Ecco le differenze. Ora c'è una sottoquery per mettere i due utenti in ordine "canonico". Quindi, tutti i messaggi tra di loro hanno lo stesso User1 e User2 (in base all'ordine alfabetico).

La partition by La clausola utilizza queste colonne, quindi tutti i messaggi sono inclusi nel seqnum calcolo. Gli Users la tabella ora recupera direttamente le informazioni sull'utente corrente.

select FromUser, ToUser, Message, [Date], UserId, UserFullName, UserName, UserPhoto
from (SELECT CM.FromUser, CM.ToUser, CM.Message, CM.[Date], U.UserId,
             U.UserFullName, U.UserName, U.UserPhoto,
             row_number() over (partition by CM.User1, CM.User2
                                order by CM.[Date] desc) as seqnum
      FROM (select CM.*,
                   (case when FromUser < ToUser then FromUser else ToUser end) as User1,
                   (case when FromUser < ToUser then ToUser else FromUser end) as User2
            from ConversationMessages CM
           ) CM CROSS JOIN
           (select *
            from Users U
            where @user = u.UserName
           ) U
      WHERE @user in (CM.ToUser, CM.FromUser)
     ) s
WHERE seqnum = 1
ORDER BY s.[Date] DESC ;

MODIFICA:

Quanto sopra restituisce le informazioni utente per @user . Per l'altro partecipante:

select FromUser, ToUser, Message, [Date], UserId, UserFullName, UserName, UserPhoto
from (SELECT CM.FromUser, CM.ToUser, CM.Message, CM.[Date], U.UserId,
             U.UserFullName, U.UserName, U.UserPhoto,
             row_number() over (partition by CM.User1, CM.User2
                                order by CM.[Date] desc) as seqnum
      FROM (select CM.*,
                   (case when FromUser < ToUser then FromUser else ToUser end) as User1,
                   (case when FromUser < ToUser then ToUser else FromUser end) as User2
            from ConversationMessages CM
           ) CM JOIN
           Users U
           on U.UserName <> @user and
              U.UserName in (CM.FromUser, CM.ToUser)
      WHERE @user in (CM.ToUser, CM.FromUser)
     ) s
WHERE seqnum = 1
ORDER BY s.[Date] DESC ;