Mysql
 sql >> Baza danych >  >> RDS >> Mysql

SQL otrzymuje ostatnie wiadomości od/do określonego użytkownika

Używam SQL Server 2008, nie mówisz, której bazy danych używasz.

Z informacji, które podałeś, twoje zapytanie wydaje się zbyt skomplikowane dla wymaganych wyników. Oto proste zapytanie, aby uzyskać wszystkie wiadomości dotyczące użytkownika 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

Musiałem zmienić niektóre nazwy pól, ponieważ w SQL Server niektóre z wybranych nazw są słowami zastrzeżonymi.

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

EDYTUJ: Teraz dodałeś więcej informacji i pokazałeś, że istnieje id pole w tabeli wiadomości, możesz użyć czegoś takiego (uwaga:mam SQL Server, więc prawdopodobnie będziesz musiał zmienić zapytanie dla 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 w FROM część zapytania znajduje najnowszą wiadomość (na podstawie id , zakładam, że jest to liczba automatycznie zwiększająca się) dla każdej zamówionej pary identyfikatorów użytkownika nadawcy/odbiorcy. Wynik tego jest ponownie dołączany do Fed_Messages tabeli, aby upewnić się, że otrzymamy poprawne nazwy nadawcy/odbiorcy.

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak odjąć dni w MySQL

  2. Coś szybszego niż get_headers()

  3. Adres URL JDBC do konfiguracji MySQL w celu użycia kodowania znaków utf8

  4. Mysql:Zamów według polubienia?

  5. Priorytet operatora AND i OR w zapytaniu wybierającym Mysql