MySQL Multiple Join in una query?


121

Ho la seguente domanda:

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

Quindi sto usando un INNER JOINe afferrando il file image_id. Quindi ora, voglio prendere quell'immagine_id e trasformarlo in images.filenamedalla tabella delle immagini.

Come posso aggiungerlo alla mia domanda?


Risposte:


209

Puoi semplicemente aggiungere un altro join come questo:

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 

Tuttavia, tieni presente che, poiché è un INNER JOIN, se hai un messaggio senza un'immagine, l'intera riga verrà saltata. Se questa è una possibilità, potresti voler fare un LEFT OUTER JOINche restituirà tutti i messaggi del tuo dashboard e un nomefile_immagine solo se ne esiste uno (altrimenti otterrai un 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
qualcuno sa come funziona effettivamente? Il secondo join unisce i risultati del primo join con la tabella 3 o si unisce separatamente alla tabella 1 e alla tabella 3? (cioè, unire la tabella 1 con la tabella 2, quindi unire la tabella 1 separatamente con la tabella 3, quindi restituire tutto?) Ha senso? Lo chiedo perché ho fatto join multi-tavolo in questo modo e talvolta ottengo risultati inaspettati.
Aaron Wallentine

3
Questo è ciò che ti dirà la clausola ON. La clausola ON per il secondo join (che unisce la terza tabella) unisce dashboard_messages alle immagini nel campo image_id in ogni tabella. Quindi, in questo caso va da A a B e poi da B a C. È sotto il tuo controllo. Potresti farlo da A a B e da A a C se necessario
John Biddle,

16

Basta aggiungere un altro join:

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

Ho condiviso la mia esperienza nell'utilizzo di due LEFT JOINS in una singola query SQL.

Ho 3 tavoli:

Tabella 1) Il paziente è costituito dalle colonne PatientID, PatientName

Tabella 2) Appointment è composta dalle colonne AppointmentID, AppointmentDateTime, PatientID, DoctorID

Tabella 3) Doctor è costituito dalle colonne DoctorID, DoctorName


Query:

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

Ho scritto la soluzione per ottenere il formato della data come "mm / gg / aa" (sotto il mio nome "VARUN TEJ REDDY")


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.