Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

grupa sql działając jak wiadomości na Facebooku (mssql sp)

Odpowiedź jest podobna do Twojej wcześniejsze pytanie . Jednak teraz musi wziąć pod uwagę, że @user może być dowolnym użytkownikiem w wiadomości.

W tym przypadku row_number() nie jest bezpośrednio pomocna.

Oto różnice. Istnieje teraz podzapytanie, które ustawia dwóch użytkowników w „kanonicznej” kolejności. Tak więc wszystkie wiadomości między nimi mają tego samego User1 i User2 (w porządku alfabetycznym).

partition by klauzula używa tych kolumn, więc wszystkie wiadomości są zawarte w seqnum obliczenie. Users tabela teraz bezpośrednio pobiera informacje o bieżącym użytkowniku.

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 ;

EDYCJA:

Powyższe zwraca informacje o użytkowniku dla @user . Dla drugiego uczestnika:

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. Sprawdź, czy tabela ma kolumnę TIMESTAMP w SQL Server za pomocą OBJECTPROPERTY()

  2. przekonwertuj numer seryjny daty Excel na zwykłą datę

  3. Przewodnik po CTE w SQL Server

  4. Czy te dwa zapytania są takie same — GROUP BY vs. DISTINCT?

  5. odpowiednik mysqldump dla SQL Server