Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

sql group agindo como mensagens do facebook (mssql sp)


A resposta é semelhante ao seu pergunta anterior . No entanto, agora, deve-se levar em conta que o @user pode ser qualquer usuário na mensagem.

Neste caso, row_number() não é diretamente de ajuda.

Aqui estão as diferenças. Agora existe uma subconsulta para colocar os dois usuários em ordem "canônica". Portanto, todas as mensagens entre eles têm o mesmo User1 e User2 (com base em ordem alfabética).

A partition by cláusula usa essas colunas, então todas as mensagens são incluídas no seqnum Cálculo. Os Users tabela agora busca informações sobre o usuário atual diretamente.
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:

O acima retorna as informações do usuário para @user . Para o outro 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 ;