Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

SQL obtém as últimas mensagens de/para determinado usuário


Estou usando o SQL Server 2008, você não diz qual banco de dados está usando.

A partir das informações que você forneceu, sua consulta parece excessivamente complexa para a saída que você precisa. Aqui está uma consulta simples para obter todas as mensagens envolvendo o usuário 36:
SELECT  
       sender.msg_user_name AS sender_user_name
       ,recipient.msg_user_name AS recipient_user_name
       ,msg_date
       ,msg_text

FROM    
       dbo.Fed_Messages 

       INNER JOIN dbo.Fed_User AS sender 
       ON sender.msg_user_id = sender_user_id

       INNER JOIN dbo.Fed_User AS recipient 
       ON recipient.msg_user_id = recipient_user_id

WHERE   
       sender_user_id = 36
       OR recipient_user_id = 36

ORDER BY
       msg_date DESC

Eu tive que alterar alguns nomes de campos, pois no SQL Server alguns dos nomes que você escolheu são palavras reservadas.

SQL Fiddle:http://sqlfiddle.com/#!3/b8e88/1

EDITAR: Agora você adicionou mais algumas informações e mostrou que há um id campo na tabela de mensagens, você poderia usar algo assim (nota:eu tenho SQL Server, então você provavelmente terá que alterar a consulta para MySQL):
SELECT  sender.msg_user_name AS sender_user_name
       ,recipient.msg_user_name AS recipient_user_name
       ,msg_date
       ,msg_text
FROM    dbo.Fed_Messages
        INNER JOIN dbo.Fed_User AS sender ON sender.msg_user_id = sender_user_id
        INNER JOIN dbo.Fed_User AS recipient ON recipient.msg_user_id = recipient_user_id
        INNER JOIN ( SELECT MAX(id) AS most_recent_message_id
                     FROM   dbo.Fed_Messages
                     GROUP BY CASE WHEN sender_user_id > recipient_user_id
                                   THEN recipient_user_id
                                   ELSE sender_user_id
                              END -- low_id
                           ,CASE WHEN sender_user_id < recipient_user_id
                                 THEN recipient_user_id
                                 ELSE sender_user_id
                            END -- high_id
                   ) T ON T.most_recent_message_id = dbo.Fed_Messages.id
WHERE   sender_user_id = 36
        OR recipient_user_id = 36
ORDER BY msg_date DESC

O SELECT no FROM parte da consulta encontra a mensagem mais recente (com base no id , estou assumindo que é um número de incremento automático) para cada par ordenado de IDs de usuário de remetente/destinatário. O resultado disso é reintegrado ao Fed_Messages tabela para garantir que os nomes do remetente/receptor estejam corretos.

SQL Fiddle atualizado:http://sqlfiddle.com/#!3/1f07a/2