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

MySQL Sélectionnez JOIN 3 Tables

Vous aurez besoin de deux jointures. Quelque chose comme ce qui suit devrait vous aider à démarrer (bien que je ne comprenne pas à 100 % la relation entre pm_data et pm_info ):

SELECT pm_info.is_read, sender.usrFirst + ' ' + sender.usrLast as sender_name, 
    pm_data.date_sent, pm_data.title, pm_data.thread_id
FROM pm_info
INNER JOIN pm_data ON pm_info.thread_id = pm_data.thread_id
INNER JOIN tblUsers AS sender ON pm_data.sender_id = tblUsers.usrID
WHERE pm_info.receiver_id = @USER_ID /*in this case, 2*/
ORDER BY pm_data.date_sent DESC

Je suppose la relation entre pm_data et pm_info est l'identifiant du fil. Si ce n'est pas le cas, vous devriez pouvoir ajuster ce qui précède selon vos besoins. J'ai également trié par date d'envoi ici, mais cela ne gardera pas les fils ensemble . Je ne sais pas si vous voulez les garder ensemble ou non d'après la façon dont vous avez formulé votre question.

Si vous souhaitez que les fils de discussion restent ensemble , vous aurez besoin d'une requête plus compliquée :

SELECT pm_info.is_read, sender.usrFirst + ' ' + sender.usrLast as sender_name, 
    pm_data.date_sent, pm_data.title, pm_data.thread_id
FROM pm_info
INNER JOIN pm_data ON pm_info.thread_id = pm_data.thread_id
INNER JOIN tblUsers AS sender ON pm_data.sender_id = tblUsers.usrID
INNER JOIN (SELECT thread_id, MAX(date_sent) AS max_date
            FROM pm_data
            GROUP BY thread_id) AS most_recent_date 
           ON pm_data.thread_id = most_recent_date.thread_id
WHERE pm_info.receiver_id = @USER_ID /*in this case, 2*/
ORDER BY most_recent_date.max_date DESC, pm_data.thread_id, 
    pm_data.date_sent DESC

Cette requête utilise une sous-sélection pour trouver la date de modification la plus récente pour chaque fil, puis trie d'abord par celle-ci.