Mysql
 sql >> база данни >  >> RDS >> Mysql

SQL получава последните съобщения от/до определен потребител

Използвам SQL Server 2008, не казвате коя база данни използвате.

От информацията, която сте предоставили, вашата заявка изглежда прекалено сложна за изхода, който ви е необходим. Ето една проста заявка за получаване на всички съобщения, включващи потребител 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

Трябваше да променя някои имена на полета, тъй като в SQL Server някои от избраните от вас имена са запазени думи.

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

РЕДАКТИРАНЕ: Сега добавихте още информация и показахте, че има id поле в таблицата със съобщения, можете да използвате нещо подобно (забележка:имам SQL Server, така че вероятно ще трябва да промените заявката за 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 в FROM част от заявката намира най-новото съобщение (въз основа на id , предполагам, че това е автоматично увеличаващо се число) за всяка поръчана двойка потребителски идентификатори на подател/получател. Резултатът от това се присъединява отново към Fed_Messages таблица, за да сме сигурни, че сме получили правилни имената на подателя/получателя.

Актуализиран 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. Как мога да се предпазя от атаки с инжектиране на SQL, използвайки DBI на Perl?

  2. Търсене на думи със скраб с заместващи знаци

  3. Групирайте изхода на SHOW COLUMNS в списък, разделен със запетая

  4. PHP:mysql_connect не връща FALSE

  5. Използвайте корелирана подзаявка в две колони