sql >> Database >  >> RDS >> Sqlserver

sql-groep door te handelen als Facebook-berichten (mssql sp)

Het antwoord is vergelijkbaar met uw eerdere vraag . Nu moet er echter rekening mee worden gehouden dat de @user kan een van beide gebruikers in het bericht zijn.

In dit geval row_number() helpt niet direct.

Hier zijn de verschillen. Er is nu een subquery om de twee gebruikers in "canonieke" volgorde te plaatsen. Dus alle berichten ertussen hebben dezelfde User1 en User2 (op alfabetische volgorde).

De partition by clausule gebruikt deze kolommen, dus alle berichten zijn opgenomen in het seqnum berekening. De Users tabel haalt nu rechtstreeks informatie over de huidige gebruiker op.

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 ;

BEWERKEN:

Het bovenstaande retourneert de gebruikersinformatie voor @user . Voor de andere deelnemer:

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. Python call sql-server opgeslagen procedure met tabelwaardeparameter

  2. liferay migreert gegevens van hsql naar mysql

  3. mySQL-rangschikking in highscore-query

  4. Hoe kan ik mijn query's samenvoegen tot een enkele query (of kan een opgeslagen proces zijn..)