Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

groupe sql en agissant comme la messagerie facebook (mssql sp)

La réponse est similaire à votre question précédente . Cependant, maintenant, il faut tenir compte du fait que le @user peut être l'un ou l'autre utilisateur dans le message.

Dans ce cas, row_number() n'est pas directement utile.

Voici les différences. Il existe maintenant une sous-requête pour mettre les deux utilisateurs dans l'ordre "canonique". Ainsi, tous les messages entre eux ont le même User1 et User2 (par ordre alphabétique).

Le partition by La clause utilise ces colonnes, donc tous les messages sont inclus dans le seqnum calcul. Les Users table récupère désormais directement les informations sur l'utilisateur actuel.

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 ;

MODIFIER :

Ce qui précède renvoie les informations utilisateur pour @user . Pour l'autre participant :

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 ;