Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL Seleziona UNISCI 3 tabelle

Avrai bisogno di due join. Qualcosa come il seguente dovrebbe iniziare (anche se non capisco al 100% la relazione tra 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

Sto assumendo la relazione tra pm_data e pm_info è l'ID del thread. In caso contrario, dovresti essere in grado di adattare quanto sopra a tutto ciò di cui hai bisogno. Ho anche ordinato per data di invio qui, ma non terrà insieme i thread . Non sono sicuro se vuoi tenerli insieme o meno dal modo in cui hai formulato la tua domanda.

Se vuoi tenere insieme le discussioni , avrai bisogno di una query più complicata:

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

Questa query utilizza una sottoselezione per trovare la data di modifica più recente per ogni thread, quindi ordina prima in base a questa.