Het antwoord is vergelijkbaar met uw eerdere vraag
. Nu moet er echter rekening mee worden gehouden dat de @user
kan een van beide gebruikers in het bericht zijn.
In dit geval row_number()
helpt niet direct.
Hier zijn de verschillen. Er is nu een subquery om de twee gebruikers in "canonieke" volgorde te plaatsen. Dus alle berichten ertussen hebben dezelfde User1
en User2
(op alfabetische volgorde).
De partition by
clausule gebruikt deze kolommen, dus alle berichten zijn opgenomen in het seqnum
berekening. De Users
tabel haalt nu rechtstreeks informatie over de huidige gebruiker op.
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 ;
BEWERKEN:
Het bovenstaande retourneert de gebruikersinformatie voor @user
. Voor de andere deelnemer:
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 ;