Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

nhóm sql bằng cách hoạt động như nhắn tin trên facebook (mssql sp)

Câu trả lời tương tự với câu hỏi trước đó . Tuy nhiên, bây giờ phải tính đến rằng @user có thể là người dùng trong tin nhắn.

Trong trường hợp này, row_number() không trực tiếp giúp đỡ.

Đây là những điểm khác biệt. Hiện có một truy vấn phụ để đưa hai người dùng vào thứ tự "chuẩn". Vì vậy, tất cả các thư giữa chúng có cùng một User1User2 (dựa trên thứ tự bảng chữ cái).

Phân vùng partition by mệnh đề sử dụng các cột này, vì vậy tất cả các thông báo được bao gồm trong seqnum phép tính. Users bảng hiện tìm nạp trực tiếp thông tin về người dùng hiện tại.

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 ;

CHỈNH SỬA:

Ở trên trả về thông tin người dùng cho @user . Đối với người tham gia khác:

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. Làm thế nào để sử dụng DATEDIFF để quay lại năm, tháng và ngày?

  2. Hiệu suất của các cách tiếp cận khác nhau đối với dữ liệu dựa trên thời gian

  3. Cố gắng đính kèm cơ sở dữ liệu được đặt tên tự động cho tệp .... database1.mdf không thành công

  4. Cập nhật cột dựa trên một cột cập nhật khác

  5. Sử dụng COL_LENGTH () để lấy độ dài của cột trong SQL Server