Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

sql група, като действа като съобщения във Facebook (mssql sp)

Отговорът е подобен на вашия предишен въпрос . Сега обаче трябва да се вземе предвид, че @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. SQL грешка:Не може да се използва пълнотекстово търсене в потребителски екземпляр.

  2. Какъв е максималният брой редове, които може да съхранява една таблица на SQL Server?

  3. Уникалният ключ на Sql Server също ли е индекс?

  4. Обяснено за ВСИЧКИ оператор на SQL Server

  5. R:[unixODBC][Диспечер на драйвери]Не може да се отвори библиотеката „SQL Server“:файлът не е намерен