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

SQL får sidste beskeder fra/til en bestemt bruger

Jeg bruger SQL Server 2008, du siger ikke hvilken database du bruger.

Ud fra de oplysninger, du har leveret, virker din forespørgsel alt for kompleks i forhold til det output, du har brug for. Her er en simpel forespørgsel for at få alle beskeder, der involverer bruger 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

Jeg har været nødt til at ændre nogle feltnavne, da nogle af de navne, du har valgt i SQL Server, er reserverede ord.

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

EDIT: Nu har du tilføjet noget mere information og vist, at der er et id feltet i meddelelsestabellen, kan du bruge noget som dette (bemærk:Jeg har SQL Server, så du bliver sandsynligvis nødt til at ændre forespørgslen til 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

SELECT i FROM en del af forespørgslen finder den seneste besked (baseret på id , jeg antager, at det er et automatisk stigningsnummer) for hvert bestilt par afsender/modtager-bruger-id'er. Resultatet af det føjes igen til Fed_Messages tabel for at sikre, at vi får navnene på afsender/modtager korrekte.

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




  1. Uløst symbol:sql::mysql::get_driver_instance(void)

  2. Sådan opretter du CreatedOn og UpdatedOn ved hjælp af EF Core 2.1 og Pomelo

  3. Hvordan hjælper databasedesign med at organisere lærere, lektioner og elever?

  4. Erstat null med 0 i MySQL