इसका उत्तर आपके पहले का प्रश्न
. हालांकि, अब, यह ध्यान में रखना चाहिए कि @user
संदेश में कोई भी उपयोगकर्ता हो सकता है।
इस मामले में, row_number()
सीधे तौर पर मदद नहीं करता है।
यहाँ मतभेद हैं। दो उपयोगकर्ताओं को "कैनोनिकल" क्रम में रखने के लिए अब एक सबक्वायरी है। इसलिए, उनके बीच के सभी संदेशों में एक ही User1
होता है और User2
(वर्णमाला के आधार पर)।
partition by
खंड इन स्तंभों का उपयोग करता है, इसलिए सभी संदेश seqnum
. में शामिल हैं गणना। Users
तालिका अब सीधे वर्तमान उपयोगकर्ता के बारे में जानकारी प्राप्त करती है।
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 ;
संपादित करें:
उपरोक्त @user
. के लिए उपयोगकर्ता जानकारी लौटाता है . अन्य प्रतिभागी के लिए:
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 ;