MySQL Multiple Joins in einer Abfrage?


121

Ich habe folgende Frage:

SELECT
  dashboard_data.headline,
  dashboard_data.message,
  dashboard_messages.image_id 
FROM dashboard_data
INNER JOIN dashboard_messages
  ON dashboard_message_id = dashboard_messages.id

Also benutze ich ein INNER JOINund greife nach dem image_id. Jetzt möchte ich diese image_id nehmen und in die Bildtabelle umwandeln images.filename.

Wie kann ich das meiner Anfrage hinzufügen?


Antworten:


209

Sie können einfach einen weiteren Join wie folgt hinzufügen:

SELECT dashboard_data.headline, dashboard_data.message, dashboard_messages.image_id, images.filename
FROM dashboard_data 
    INNER JOIN dashboard_messages 
        ON dashboard_message_id = dashboard_messages.id
    INNER JOIN images
        ON dashboard_messages.image_id = images.image_id 

INNER JOINBeachten Sie jedoch, dass die gesamte Zeile übersprungen wird , wenn Sie eine Nachricht ohne Bild haben. Wenn dies möglich ist, möchten Sie möglicherweise LEFT OUTER JOINeine ausführen, die alle Ihre Dashboard-Nachrichten und einen Bilddateinamen nur zurückgibt, wenn eine vorhanden ist (andernfalls erhalten Sie eine Null).

SELECT dashboard_data.headline, dashboard_data.message, dashboard_messages.image_id, images.filename
FROM dashboard_data 
    INNER JOIN dashboard_messages 
        ON dashboard_message_id = dashboard_messages.id
    LEFT OUTER JOIN images
        ON dashboard_messages.image_id = images.image_id 

19
weiß jemand wie das eigentlich funktioniert? Verbindet der zweite Join die Ergebnisse des ersten Joins mit Tabelle 3 oder verbindet er Tabelle 1 mit Tabelle 3 separat? (dh Tabelle 1 mit Tabelle 2 verbinden und dann Tabelle 1 separat mit Tabelle 3 verbinden und dann alles zurückgeben?) Ist das sinnvoll? Ich frage, weil ich solche Joins mit mehreren Tabellen durchgeführt habe und manchmal unerwartete Ergebnisse erhalte.
Aaron Wallentine

3
Das sagt Ihnen die ON-Klausel. Die ON-Klausel für den 2. Join (Beitritt zur dritten Tabelle) verbindet Dashboard_Meldungen mit Bildern im Feld image_id in jeder Tabelle. In diesem Fall ist es also A nach B, dann B nach C. Es liegt unter Ihrer Kontrolle. Sie könnten es A nach B und A nach C machen, wenn Sie brauchen
John Biddle

16

Fügen Sie einfach einen weiteren Join hinzu:

SELECT dashboard_data.headline,
       dashboard_data.message,
       dashboard_messages.image_id,
       images.filename 
FROM dashboard_data 
    INNER JOIN dashboard_messages
            ON dashboard_message_id = dashboard_messages.id 
    INNER JOIN images
            ON dashboard_messages.image_id = images.image_id

9

Ich teilte meine Erfahrungen mit der Verwendung von zwei LEFT JOINS in einer einzigen SQL-Abfrage.

Ich habe 3 Tische:

Tabelle 1) Patient besteht aus den Spalten PatientID, PatientName

Tabelle 2) Termin besteht aus den Spalten AppointmentID, AppointmentDateTime, PatientID, DoctorID

Tabelle 3) Doctor besteht aus den Spalten DoctorID, DoctorName


Abfrage:

SELECT Patient.patientname, AppointmentDateTime, Doctor.doctorname

FROM Appointment 

LEFT JOIN Doctor ON Appointment.doctorid = Doctor.doctorId  //have doctorId column common

LEFT JOIN Patient ON Appointment.PatientId = Patient.PatientId      //have patientid column common

WHERE Doctor.Doctorname LIKE 'varun%' // setting doctor name by using LIKE

AND Appointment.AppointmentDateTime BETWEEN '1/16/2001' AND '9/9/2014' //comparison b/w dates 

ORDER BY AppointmentDateTime ASC;  // getting data as ascending order

Ich habe die Lösung geschrieben, um ein Datumsformat wie "MM / TT / JJ" (unter meinem Namen "VARUN TEJ REDDY") zu erhalten.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.