2016-04-06 20 views
0

Sahip olduğum sorunu göstermek için bu basit örneği ekledim. Veritabanımın foo olduğunu söyle. MySQL, INNER JOIN'i bazı null olarak bile olsa çok sayıda sütun arasında nasıl yapılır.

SELECT 
    `people`.`id` 
    , `people`.`name` 
    , `places`.`place_type` 
    , `places`.`aread` 
    , `family`.`family_count` 
    , `income`.`income_value` 
    , `income`.`average` 
    , `employment`.`address` 
    , `employment`.`duration` 
FROM 
    `people` 
    INNER JOIN `places` 
     ON (`people`.`id` = `places`.`id`) 
    INNER JOIN `family` 
     ON (`people`.`id` = `family`.`id`) 
    INNER JOIN `income` 
     ON (`people`.`id` = `income`.`id`) 
    INNER JOIN `employment` 
     ON (`people`.`id` = `employment`.`id`) WHERE `people`.`full_name` = ? LIMIT 1 

Şimdi burada mesele people.id diğer sütunlarda her id eşleşen değilse ben boş değerler elde edilmesi. Bunun nedeni, kimliği olan kişilerin hepsinin yer, aile, gelir ... sütunlarında bulunmamasıdır. Yani,

+0

Ne istediğinizden emin değil misiniz? Sadece aynı people.id ile tüm tablolarda bir giriş varsa bir satır dönmek istiyor musunuz? – Remy

+1

Eğer doğru bir şekilde anladıysam, tüm kayıtları "People table" dan mı istiyorsun? Eğer evet ise o zaman 'LEFT JOIN' –

cevap

2

Hemen değiştirmek senin RIGHT tablolardan LEFT masa ve sadece eşleştirme tüm kayıtları döndürmek LEFT JOIN katılır:

SELECT 
    `people`.`id` 
    , `people`.`name` 
    , `places`.`place_type` 
    , `places`.`aread` 
    , `family`.`family_count` 
    , `income`.`income_value` 
    , `income`.`average` 
    , `employment`.`address` 
    , `employment`.`duration` 
FROM  
    `people` 
    LEFT JOIN `places` 
     ON (`people`.`id` = `places`.`id`) 
    LEFT JOIN `family` 
     ON (`people`.`id` = `family`.`id`) 
    LEFT JOIN `income` 
     ON (`people`.`id` = `income`.`id`) 
    LEFT JOIN `employment` 
     ON (`people`.`id` = `employment`.`id`) WHERE `people`.`full_name` = ? LIMIT 1 

DÜZENLEME: almadığına hangi tabloları bilmek istiyorsanız Bir eşleşme yok, sadece boş değerleri arayın. Birleşmeden ayrıldığınızda, koşulla eşleşmeyen tablolar, sütun seçiminde NULL değerlerini alır.

+0

Teşekkürler, örneğin hangi sütunun sonuçta eksik olduğunu bilmenin bir yolu var mı? Demek istediğim, eğer 'aile' eksikse, 'LEFT JOIN ailesi f' gibi bir şey yapmanın ve sonuçta 'boş ($ sonuç [' f ']) 'ya da benzer bir şey yapabildiğimi bilmenin bir yolu var mıdır? – ANW

+0

@ANW Kayıp olanlar "NULL" değerleri olarak seçilecek! Yani bu tablolardan boş olan her sütun (Varsayılan olarak boş değil) bu tablonun eksik olduğu anlamına gelir. – sagi

1

income.idINNER JOIN ile LEFT JOIN değiştirin .. daima örneğin people.id diyelim ki aynı olmasa bile people.id bir değer döndürür nasıl bilmek istiyorum.

SELECT 
    `people`.`id` 
    , `people`.`name` 
    , `places`.`place_type` 
    , `places`.`aread` 
    , `family`.`family_count` 
    , `income`.`income_value` 
    , `income`.`average` 
    , `employment`.`address` 
    , `employment`.`duration` 
FROM 
    `people` 
    LEFT JOIN `places` 
     ON (`people`.`id` = `places`.`id`) 
    LEFT JOIN `family` 
     ON (`people`.`id` = `family`.`id`) 
    LEFT JOIN `income` 
     ON (`people`.`id` = `income`.`id`) 
    LEFT JOIN `employment` 
     ON (`people`.`id` = `employment`.`id`) WHERE `people`.`full_name` = ? LIMIT 1 
+0

kullanın. Teşekkürler, hangi sütunun sonuçtan eksik olduğunu bilmenin bir yolu var mı? Demek istediğim, eğer 'aile' eksikse, 'LEFT JOIN ailesi f' gibi bir şey yapmanın ve sonuçta 'boş ($ sonuç [' f ']) 'ya da benzer bir şey yapabildiğimi bilmenin bir yolu var mıdır? – ANW

İlgili konular