Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

फेसबुक मैसेजिंग की तरह अभिनय करके एसक्यूएल समूह (एमएसएसक्यूएल एसपी)

इसका उत्तर आपके पहले का प्रश्न . हालांकि, अब, यह ध्यान में रखना चाहिए कि @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 ;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. NHibernate के लिए SQL 2008 बोली समर्थन

  2. SQL सर्वर में एक अद्वितीय मान बनाने के लिए NEWID () का उपयोग करें

  3. SQL सर्वर (T-SQL) में दिनांक और समय कार्यों की सूची

  4. एसक्यूएल - मैं टीएसक्यूएल में पुन:प्रवेश के लिए कैसे पूछताछ करूं?

  5. नौकरी निर्यात करते समय SQL सर्वर द्वारा उत्पन्न अजीब स्क्रिप्ट