sql >> Base de Datos >  >> RDS >> Sqlserver

grupo sql actuando como mensajería de Facebook (mssql sp)

La respuesta es similar a su pregunta anterior . Sin embargo, ahora, se debe tener en cuenta que el @user podría ser cualquier usuario en el mensaje.

En este caso, row_number() no es directamente de ayuda.

Aquí están las diferencias. Ahora hay una subconsulta para poner a los dos usuarios en orden "canónico". Entonces, todos los mensajes entre ellos tienen el mismo User1 y User2 (basado en orden alfabético).

La partition by utiliza estas columnas, por lo que todos los mensajes se incluyen en el seqnum cálculo. Los Users la tabla ahora obtiene información sobre el usuario actual directamente.

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 ;

EDITAR:

Lo anterior devuelve la información de usuario para @user . Para el otro participante:

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 ;