sql >> Databasteknik >  >> RDS >> Sqlserver

sql-grupp genom att agera som Facebook-meddelanden (mssql sp)

Svaret liknar ditt tidigare fråga . Men nu måste den ta hänsyn till att @user kan vara någon av användarna i meddelandet.

I det här fallet, row_number() är inte direkt till hjälp.

Här är skillnaderna. Det finns nu en underfråga för att placera de två användarna i "kanonisk" ordning. Så alla meddelanden mellan dem har samma User1 och User2 (baserat på alfabetisk ordning).

partition by satsen använder dessa kolumner, så alla meddelanden ingår i seqnum beräkning. Users Tabell hämtar nu information om den aktuella användaren direkt.

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:

Ovanstående returnerar användarinformationen för @user . För den andra deltagaren:

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. SQL-fråga med gå med och gruppera efter och

  2. MySQL beställ flera vägbeskrivningar med FIND_IN_SET

  3. SET NULL:Ange en sträng som ska returneras när ett nollvärde förekommer i SQLcl / SQL*Plus

  4. NULLIF() Funktion i Oracle