MySQL Multiple Joins w jednym zapytaniu?


121

Mam następujące zapytanie:

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

Więc używam INNER JOINi chwytam image_id. Więc teraz chcę pobrać ten image_id i przekształcić go w images.filenamez tabeli obrazów.

Jak mogę to dodać do mojego zapytania?


Odpowiedzi:


209

Możesz po prostu dodać kolejne połączenie w ten sposób:

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 

Należy jednak pamiętać, że ponieważ jest to komunikat INNER JOIN, jeśli masz wiadomość bez obrazu, cały wiersz zostanie pominięty. Jeśli jest taka możliwość, możesz zechcieć wykonać a, LEFT OUTER JOINktóre zwróci wszystkie wiadomości z pulpitu nawigacyjnego i nazwę pliku obrazu tylko wtedy, gdy istnieje (w przeciwnym razie otrzymasz wartość 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
ktoś wie, jak to właściwie działa? Czy drugie sprzężenie łączy wyniki pierwszego łączenia z tabelą 3, czy też łączy tabelę 1 z tabelą 3 oddzielnie? (tj. połączenie stołu 1 z tabelą 2, a następnie osobne połączenie stołu 1 z tabelą 3 i zwrócenie wszystkiego z powrotem?) Czy to ma sens? Pytam, ponieważ robię takie połączenia wielostołowe i czasami otrzymuję nieoczekiwane rezultaty.
Aaron Wallentine

3
To właśnie powie Ci klauzula ON. Klauzula ON dla drugiego sprzężenia (dołączenia do trzeciej tabeli) polega na połączeniu komunikatów dashboard_messages z obrazami w polu image_id w każdej tabeli. W tym przypadku jest to od A do B, a następnie od B do C. Jest to pod Twoją kontrolą. Jeśli potrzebujesz, możesz przejść z punktu A do B i A do C
John Biddle

16

Po prostu dodaj kolejne dołączenie:

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

Podzieliłem się swoim doświadczeniem w używaniu dwóch LEFT JOINS w pojedynczym zapytaniu SQL.

Mam 3 stoły:

Tabela 1) Pacjent składa się z kolumn PatientID, PatientName

Tabela 2) Spotkanie składa się z kolumn AppointmentID, AppointmentDateTime, PatientID, DoctorID

Tabela 3) Doctor składa się z kolumn DoctorID, DoctorName


Pytanie:

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

Napisałem rozwiązanie, aby uzyskać format daty, taki jak „mm / dd / rr” (pod moim nazwiskiem „VARUN TEJ REDDY”)


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.