하나의 쿼리에서 MySQL 다중 조인?


121

다음 쿼리가 있습니다.

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

그래서 나는를 사용 INNER JOIN하고 image_id. 이제이 image_id를 images.filename이미지 테이블에서 가져오고 싶습니다 .

내 쿼리에 어떻게 추가 할 수 있습니까?


답변:


209

다음과 같이 다른 조인을 추가 할 수 있습니다.

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 JOIN이미지가없는 메시지가있는 경우 전체 행을 건너 뜁니다. 이것이 가능한 경우 LEFT OUTER JOIN모든 대시 보드 메시지와 하나가있는 경우에만 image_filename을 반환 하는 a를 수행 할 수 있습니다 (그렇지 않으면 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
이것이 실제로 어떻게 작동하는지 아는 사람 있나요? 두 번째 조인이 첫 번째 조인의 결과를 테이블 3과 조인합니까, 아니면 테이블 1을 테이블 3과 별도로 조인합니까? (즉, 표 1을 표 2와 결합한 다음 표 1을 표 3과 별도로 결합한 다음 모두 다시 반환합니까?) 그게 말이됩니까? 이와 같이 다중 테이블 조인을 해왔 기 때문에 물어보고 때로는 예기치 않은 결과를 얻습니다.
Aaron Wallentine

3
이것이 ON 절이 여러분에게 알려줄 것입니다. 두 번째 조인 (세 번째 테이블 조인)의 ON 절은 dashboard_messages를 각 테이블의 image_id 필드에있는 이미지에 조인합니다. 그래서,이 경우에는 A에서 B로, B에서 C로. 그것은 당신의 통제하에 있습니다. 당신이 필요로하는 경우 C에 B와 A를 그것을 만들 수
존 비들

16

다른 조인을 추가하기 만하면됩니다.

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

단일 SQL 쿼리에서 두 개의 LEFT JOINS를 사용한 경험을 공유했습니다.

3 개의 테이블이 있습니다.

표 1) 환자는 PatientID, PatientName 열로 구성됩니다.

표 2) Appointment는 AppointmentID, AppointmentDateTime, PatientID, DoctorID 열로 구성됩니다.

표 3) Doctor는 DoctorID, DoctorName 열로 구성됩니다.


질문:

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

"mm / dd / yy" (내 이름 "VARUN TEJ REDDY") 와 같은 날짜 형식 을 얻는 솔루션을 작성했습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.