Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL Wählen Sie JOIN 3 Tabellen

Sie benötigen zwei Verknüpfungen. Etwas wie das Folgende sollte Ihnen den Einstieg erleichtern (obwohl ich die Beziehung zwischen pm_data und 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

Ich gehe von der Beziehung zwischen pm_data aus und pm_info ist die Thread-ID. Wenn dies nicht der Fall ist, sollten Sie in der Lage sein, die obigen Einstellungen an Ihre Bedürfnisse anzupassen. Ich habe auch hier nach Sendedatum sortiert, aber das hält die Threads nicht zusammen . Ich bin mir nicht sicher, ob Sie sie zusammenhalten möchten oder nicht, wie Sie Ihre Frage formuliert haben.

Wenn Sie die Fäden zusammenhalten möchten , benötigen Sie eine kompliziertere Abfrage:

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

Diese Abfrage verwendet eine Unterauswahl, um das letzte Änderungsdatum für jeden Thread zu finden, und sortiert dann zuerst danach.