sql >> Databáze >  >> RDS >> Mysql

MySQL Select JOIN 3 Tables

Budete potřebovat dvě spojení. Něco jako následující by vám mělo pomoci začít (ačkoli 100% nerozumím vztahu mezi pm_data a 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

Předpokládám vztah mezi pm_data a pm_info je id vlákna. Pokud tomu tak není, měli byste být schopni výše uvedené upravit podle toho, co potřebujete. Také jsem seřadil podle data odeslání sem, ale neudrží vlákna pohromadě . Nejsem si jistý, jestli je chcete držet pohromadě, nebo ne podle toho, jak jste formulovali svou otázku.

Pokud chcete mít vlákna pohromadě , budete potřebovat složitější dotaz:

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

Tento dotaz používá dílčí výběr k vyhledání posledního data změny pro každé vlákno a poté seřadí nejprve podle tohoto.



  1. Chybí služba Mysql

  2. Jak replikovat pouze INSERTy, nikoli DELETE/UPDATE na Slony Slave Node?

  3. Vyberte MySQL s podmínkou CONCAT

  4. Jak získat aktuální čas (bez časového pásma) v PostgreSQL