sql >> Databáze >  >> RDS >> Sqlserver

sql group tím, že se chová jako facebookové zprávy (mssql sp)

Odpověď je podobná vaší dřívější otázka . Nyní je však třeba vzít v úvahu, že @user může být kterýkoli uživatel ve zprávě.

V tomto případě row_number() není přímou nápovědou.

Zde jsou rozdíly. Nyní existuje dílčí dotaz, který má dva uživatele umístit do „kanonického“ pořadí. Takže všechny zprávy mezi nimi mají stejný User1 a User2 (na základě abecedního pořadí).

partition by klauzule používá tyto sloupce, takže všechny zprávy jsou zahrnuty v seqnum výpočet. Users tabulka nyní přímo načítá informace o aktuálním uživateli.

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:

Výše uvedené vrátí informace o uživateli pro @user . Pro druhého účastníka:

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. Výkon funkcí MySql Xml?

  2. Jak získám aktuální časové pásmo MySQL?

  3. Zálohujte PostgreSQL pomocí pg_dump a pg_dumpall

  4. Cakephp – obsahuje (kontejnovatelné chování) načítá příliš mnoho