Mysql
 sql >> Database >  >> RDS >> Mysql

SQL ottiene gli ultimi messaggi da/per un determinato utente

Sto usando SQL Server 2008, non dici quale database stai usando.

Dalle informazioni che hai fornito la tua query sembra eccessivamente complessa per l'output richiesto. Ecco una semplice query per ottenere tutti i messaggi che coinvolgono l'utente 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

Ho dovuto modificare alcuni nomi di campo poiché in SQL Server alcuni dei nomi che hai scelto sono parole riservate.

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

MODIFICA: Ora hai aggiunto altre informazioni e mostrato che c'è un id campo nella tabella dei messaggi, potresti usare qualcosa del genere (nota:ho SQL Server quindi probabilmente dovrai cambiare la query per 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

Il SELECT nel FROM parte della query trova il messaggio più recente (basato su id , suppongo che sia un numero a incremento automatico) per ogni coppia ordinata di ID utente mittente/destinatario. Il risultato viene ricongiunto a Fed_Messages tabella per assicurarci di ottenere i nomi di mittente/destinatario corretti.

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