Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SQL holt die letzten Nachrichten von/an einen bestimmten Benutzer

Ich verwende SQL Server 2008, Sie sagen nicht, welche Datenbank Sie verwenden.

Aufgrund der von Ihnen bereitgestellten Informationen scheint Ihre Abfrage für die von Ihnen benötigte Ausgabe zu komplex zu sein. Hier ist eine einfache Abfrage, um alle Nachrichten zu erhalten, die Benutzer 36 betreffen:

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

Ich musste einige Feldnamen ändern, da in SQL Server einige der von Ihnen gewählten Namen reservierte Wörter sind.

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

BEARBEITEN: Jetzt haben Sie weitere Informationen hinzugefügt und es wird eine id angezeigt Feld in der Nachrichtentabelle, könnten Sie so etwas verwenden (Hinweis:Ich habe SQL Server, also müssen Sie wahrscheinlich die Abfrage für MySQL ändern):

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

Die SELECT im FROM Teil der Abfrage findet die neueste Nachricht (basierend auf der id , ich gehe davon aus, dass es sich um eine automatisch inkrementierende Nummer handelt) für jedes geordnete Paar von Absender-/Empfänger-Benutzer-IDs. Das Ergebnis davon wird wieder zu den Fed_Messages hinzugefügt Tabelle, um sicherzustellen, dass wir die Namen für Absender/Empfänger korrekt erhalten.

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