sql >> データベース >  >> RDS >> Sqlserver

Facebook メッセージのように振る舞う SQL グループ (mssql sp)

    答えはあなたの 以前の質問 。ただし、ここでは、@user を考慮に入れる必要があります。 メッセージ内のいずれかのユーザーである可能性があります。

    この場合、 row_number() 直接の助けにはなりません.

    ここに違いがあります。 2 人のユーザーを「正規」の順序で並べるサブクエリが追加されました。したがって、それらの間のすべてのメッセージは同じ 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. aws --ec2 --mysql --instance stop、reboot-他のユーザーのパスワードが変更されました

    2. パラメータ化されたクエリPHP/MySQL

    3. MySQLの複数のインデックスと検索用の複数列のインデックス

    4. SQL/正規表現チャレンジ/パズル:(SQLクエリを使用して)SQLコードからコメントを削除する方法は?