Jawabannya mirip dengan pertanyaan sebelumnya
. Namun, sekarang, harus memperhitungkan bahwa @user
bisa menjadi salah satu pengguna dalam pesan.
Dalam hal ini, row_number()
tidak secara langsung membantu.
Berikut perbedaannya. Sekarang ada subquery untuk menempatkan dua pengguna dalam urutan "kanonik". Jadi, semua pesan di antara mereka memiliki User1
yang sama dan User2
(berdasarkan urutan abjad).
partition by
klausa menggunakan kolom ini, jadi semua pesan disertakan dalam seqnum
perhitungan. Users
tabel sekarang mengambil informasi tentang pengguna saat ini secara langsung.
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 ;
EDIT:
Di atas mengembalikan informasi pengguna untuk @user
. Untuk peserta lain:
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 ;