sql >> Databáze >  >> RDS >> Mysql

SQL získá poslední zprávy od/k určitému uživateli

Používám SQL Server 2008, neuvádíte, kterou databázi používáte.

Z informací, které jste poskytli, se váš dotaz zdá příliš složitý pro požadovaný výstup. Zde je jednoduchý dotaz na získání všech zpráv týkajících se uživatele 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

Musel jsem změnit některá jména polí, protože na serveru SQL Server jsou některá z vybraných názvů vyhrazená slova.

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

UPRAVIT: Nyní jste přidali nějaké další informace a ukázalo se, že existuje id pole v tabulce zpráv, můžete použít něco takového (poznámka:Mám SQL Server, takže pravděpodobně budete muset změnit dotaz na 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 v FROM část dotazu najde nejnovější zprávu (na základě id , Předpokládám, že se jedná o automaticky se zvyšující číslo) pro každý objednaný pár ID uživatele odesílatele/příjemce. Výsledek je znovu připojen k Fed_Messages tabulky, abychom zajistili, že jména odesílatele/příjemce obdržíme správně.

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




  1. Proč uzavíráme výsledek v Mysqli

  2. SQL:jak byl v tomto případě vytvořen dotaz v pořadí SQL

  3. Účastníte se PASS Summit v Charlotte?

  4. Získávání kolekcí po sobě jdoucích dat