Tek bir sorguda MySQL Çoklu Birleştirme?


121

Şu sorguya sahibim:

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

Bu yüzden bir kullanıyorum INNER JOINve image_id. Şimdi, bu image_id'yi alıp images.filenameresimler tablosundan dönüştürmek istiyorum .

Bunu sorguma nasıl ekleyebilirim?


Yanıtlar:


209

Bunun gibi başka bir birleşim ekleyebilirsiniz:

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 

Ancak, bu bir olduğundan INNER JOIN, resimsiz bir mesajınız varsa, tüm satırın atlanacağını unutmayın. Bu bir olasılıksa, LEFT OUTER JOINtüm pano mesajlarınızı ve yalnızca varsa bir resim_dosya adını döndürecek bir yapmak isteyebilirsiniz (aksi takdirde bir boş alırsınız)

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
Bunun nasıl çalıştığını bilen var mı? İkinci birleştirme ilk birleşimin sonuçlarına tablo 3 ile mi katılıyor yoksa tablo 1 ile tablo 3'e ayrı ayrı mı katılıyor? (yani, tablo 1'i tablo 2 ile birleştirmek ve sonra tablo 1'e ayrı olarak tablo 3 ile katılmak, sonra hepsini geri getirmek?) Bu mantıklı mı? Soruyorum çünkü böyle çok masalı birleştirmeler yapıyorum ve bazen beklenmedik sonuçlar alıyorum.
Aaron Wallentine

3
ON maddesi size bunu söyleyecektir. 2. birleştirme için ON cümlesi (üçüncü tabloyu birleştirerek), dashboard_messages'ı her tablodaki image_id alanındaki resimlere birleştirmektir. Yani, bu durumda A'dan B'ye, sonra B'den C'ye. Kontrolünüz altında. İhtiyacınız olursa A'dan B'ye ve A'dan C'ye yapabilirsiniz
John Biddle

16

Sadece başka bir birleşim ekleyin:

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

Tek bir SQL sorgusunda iki LEFT JOINS kullanma deneyimimi paylaştım.

3 masam var:

Tablo 1) Hasta, Hasta Kimliği, Hasta Adı sütunlarından oluşur

Tablo 2) Randevu, Randevu Kimliği, RandevuTarihSaati, Hasta Kimliği, Doktor Kimliği sütunlarından oluşur

Tablo 3) Doktor, DoctorID, DoctorName sütunlarından oluşur


Sorgu:

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

"Aa / gg / yy" gibi bir tarih formatı almak için çözüm yazdım ("VARUN TEJ REDDY" adımın altında)


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.