MySQL Nhiều tham gia trong một truy vấn?


121

Tôi có truy vấn sau:

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

Vì vậy, tôi đang sử dụng một INNER JOINvà lấy image_id. Vì vậy, bây giờ, tôi muốn lấy image_id đó và biến nó thành images.filenametừ bảng hình ảnh.

Làm cách nào để thêm nó vào truy vấn của tôi?


Câu trả lời:


209

Bạn chỉ cần thêm một tham gia khác như sau:

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 

Tuy nhiên, hãy lưu ý rằng, vì đó là một INNER JOIN, nếu bạn có một thư không có hình ảnh, toàn bộ hàng sẽ bị bỏ qua. Nếu đây là khả năng, bạn có thể muốn thực hiện điều LEFT OUTER JOINnày sẽ trả về tất cả các thông báo trên bảng điều khiển của bạn và chỉ một image_filename nếu tồn tại (nếu không bạn sẽ nhận được giá trị rỗng)

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
bất kỳ ai biết điều này thực sự hoạt động như thế nào? Tham gia thứ hai là kết quả của tham gia đầu tiên với bảng 3, hay nó tham gia bảng 1 với bảng 3 riêng biệt? (tức là, ghép bảng 1 với bảng 2, sau đó ghép riêng bảng 1 với bảng 3, rồi trả lại tất cả?) Điều đó có hợp lý không? Tôi hỏi bởi vì tôi đã thực hiện các phép nối nhiều bảng như thế này, và đôi khi nhận được kết quả không mong muốn.
Aaron Wallentine

3
Đó là điều mà mệnh đề ON sẽ cho bạn biết. Mệnh đề BẬT cho phép nối thứ 2 (tham gia bảng thứ ba) đang nối dashboard_messages với các hình ảnh trên trường image_id trong mỗi bảng. Vì vậy, trong trường hợp này, đó là A đến B rồi B ​​đến C. Nó nằm trong tầm kiểm soát của bạn. Bạn có thể làm cho nó từ A đến B và A đến C nếu bạn cần
John Biddle

16

Chỉ cần thêm một tham gia khác:

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

Tôi đã chia sẻ kinh nghiệm sử dụng hai LEFT JOINS trong một truy vấn SQL.

Tôi có 3 bảng:

Bảng 1) Bệnh nhân bao gồm các cột ID bệnh nhân, Tên bệnh nhân

Bảng 2) Cuộc hẹn bao gồm các cột AppointmentID, AppointmentDateTime, PatientID, DoctorID

Bảng 3) Doctor bao gồm các cột DoctorID, DoctorName


Truy vấn:

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

Tôi đã viết giải pháp để có định dạng ngày như "mm / dd / yy" (dưới tên của tôi "VARUN TEJ REDDY")


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.