Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL Selecionar JOIN 3 Tabelas


Você precisará de duas junções. Algo como o seguinte deve começar (embora eu não entenda 100% a relação entre pm_data e 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

Estou assumindo a relação entre pm_data e pm_info é o ID do thread. Se não for, você deve ser capaz de ajustar o acima para o que precisar. Também classifiquei por data de envio aqui, mas não manterá os tópicos juntos . Não tenho certeza se você deseja mantê-los juntos ou não pela maneira como você formulou sua pergunta.

Se você quiser manter os tópicos juntos , você precisará de uma consulta mais complicada:
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

Essa consulta usa uma subseleção para encontrar a data de modificação mais recente para cada encadeamento e, em seguida, classifica por isso primeiro.