sql >> Database >  >> RDS >> Mysql

MySQL Select JOIN 3 Tables

Je hebt twee joins nodig. Iets als het volgende zou u op weg moeten helpen (hoewel ik de relatie tussen pm_data niet 100% begrijp en 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

Ik neem aan dat de relatie tussen pm_data en pm_info is de thread-ID. Als dit niet het geval is, zou je het bovenstaande moeten kunnen aanpassen aan wat je nodig hebt. Ik heb ook gesorteerd op datum die hierheen is verzonden, maar het houdt de discussies niet bij elkaar . Ik weet niet zeker of je ze bij elkaar wilt houden of niet, gezien de manier waarop je je vraag hebt gesteld.

Als je discussielijnen bij elkaar wilt houden , heb je een meer gecompliceerde vraag nodig:

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

Deze zoekopdracht gebruikt een subselectie om de meest recente wijzigingsdatum voor elke thread te vinden en sorteert vervolgens eerst op deze.



  1. Oracle:verschil tussen max(id)+1 en sequence.nextval

  2. Conversie mislukt bij het converteren van de varchar-waarde 'simple' naar gegevenstype int

  3. Hoe MySQL-queryresultaten in een andere tabel opslaan?

  4. C# - Hoe een orakel lange onbewerkte typewaarde te krijgen