sql >> Database >  >> RDS >> Mysql

SQL krijgt laatste berichten van/naar bepaalde gebruiker

Ik gebruik SQL Server 2008, je zegt niet welke database je gebruikt.

Op basis van de informatie die u hebt verstrekt, lijkt uw vraag te complex voor de uitvoer die u nodig heeft. Hier is een eenvoudige vraag om alle berichten van gebruiker 36 te krijgen:

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

Ik heb enkele veldnamen moeten wijzigen omdat in SQL Server sommige van de namen die je hebt gekozen gereserveerde woorden zijn.

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

BEWERKEN: Je hebt nu wat meer informatie toegevoegd en er is een id . weergegeven veld in de berichtentabel, zou je zoiets als dit kunnen gebruiken (opmerking:ik heb SQL Server, dus je zult waarschijnlijk de query voor MySQL moeten wijzigen):

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

De SELECT in de FROM een deel van de zoekopdracht vindt het meest recente bericht (gebaseerd op de id , ik neem aan dat het een automatisch oplopend nummer is) voor elk besteld paar gebruikers-ID's van afzender/ontvanger. Het resultaat daarvan wordt weer toegevoegd aan de Fed_Messages tabel om ervoor te zorgen dat we de namen voor de afzender/ontvanger correct krijgen.

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




  1. Hoe de W10 Universal App te verbinden met de MySQL-database

  2. Waarom is PHP PDO DSN een ander formaat voor MySQL dan voor PostgreSQL?

  3. Controleer op databaseverbinding, anders bericht weergeven

  4. hulp nodig bij het toevoegen van een kolom aan één tabel met behulp van een functie die rekenkundige bewerkingen uitvoert tussen kolommen uit twee afzonderlijke tabellen