Mysql
 sql >> Base de données >  >> RDS >> Mysql

SQL récupère les derniers messages de/vers certains utilisateurs

J'utilise SQL Server 2008, vous ne dites pas quelle base de données vous utilisez.

D'après les informations que vous avez fournies, votre requête semble trop complexe pour la sortie dont vous avez besoin. Voici une requête simple pour obtenir tous les messages impliquant l'utilisateur 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

J'ai dû changer certains noms de champs car dans SQL Server, certains des noms que vous avez choisis sont des mots réservés.

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

MODIF : Vous avez maintenant ajouté quelques informations supplémentaires et montré qu'il existe un id sur la table des messages, vous pouvez utiliser quelque chose comme ceci (remarque :j'ai SQL Server, vous devrez donc probablement modifier la requête pour 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

Le SELECT dans le FROM une partie de la requête trouve le message le plus récent (basé sur le id , je suppose qu'il s'agit d'un numéro à incrémentation automatique) pour chaque paire ordonnée d'ID utilisateur expéditeur/destinataire. Le résultat de cela est rejoint dans les Fed_Messages tableau pour nous assurer que nous obtenons les noms corrects pour l'expéditeur/le destinataire.

SQL Fiddle mis à jour :http://sqlfiddle.com/#!3/1f07a/2