Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

grup sql dengan bertindak seperti pesan facebook (mssql sp)

Jawabannya mirip dengan pertanyaan sebelumnya . Namun, sekarang, harus memperhitungkan bahwa @user bisa menjadi salah satu pengguna dalam pesan.

Dalam hal ini, row_number() tidak secara langsung membantu.

Berikut perbedaannya. Sekarang ada subquery untuk menempatkan dua pengguna dalam urutan "kanonik". Jadi, semua pesan di antara mereka memiliki User1 yang sama dan User2 (berdasarkan urutan abjad).

partition by klausa menggunakan kolom ini, jadi semua pesan disertakan dalam seqnum perhitungan. Users tabel sekarang mengambil informasi tentang pengguna saat ini secara langsung.

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:

Di atas mengembalikan informasi pengguna untuk @user . Untuk peserta lain:

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. Hubungkan SQL Server ke SugarCRM

  2. Bagaimana cara menghindari satu kutipan di SQL Server?

  3. Bagaimana membandingkan tanggal di SQL Server

  4. Terhubung ke SQL Server 2008 dengan TCP/IP

  5. 4 Tips untuk Menyiapkan Peringatan SQL Server Anda