Câu trả lời tương tự với câu hỏi trước đó
. Tuy nhiên, bây giờ phải tính đến rằng @user
có thể là người dùng trong tin nhắn.
Trong trường hợp này, row_number()
không trực tiếp giúp đỡ.
Đây là những điểm khác biệt. Hiện có một truy vấn phụ để đưa hai người dùng vào thứ tự "chuẩn". Vì vậy, tất cả các thư giữa chúng có cùng một User1
và User2
(dựa trên thứ tự bảng chữ cái).
Phân vùng partition by
mệnh đề sử dụng các cột này, vì vậy tất cả các thông báo được bao gồm trong seqnum
phép tính. Users
bảng hiện tìm nạp trực tiếp thông tin về người dùng hiện tại.
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 ;
CHỈNH SỬA:
Ở trên trả về thông tin người dùng cho @user
. Đối với người tham gia khác:
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 ;