La réponse est similaire à votre question précédente
. Cependant, maintenant, il faut tenir compte du fait que le @user
peut être l'un ou l'autre utilisateur dans le message.
Dans ce cas, row_number()
n'est pas directement utile.
Voici les différences. Il existe maintenant une sous-requête pour mettre les deux utilisateurs dans l'ordre "canonique". Ainsi, tous les messages entre eux ont le même User1
et User2
(par ordre alphabétique).
Le partition by
La clause utilise ces colonnes, donc tous les messages sont inclus dans le seqnum
calcul. Les Users
table récupère désormais directement les informations sur l'utilisateur actuel.
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 ;
MODIFIER :
Ce qui précède renvoie les informations utilisateur pour @user
. Pour l'autre participant :
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 ;