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 ;