2009-08-10 9 views
15

id1, id2, type numaralı bir tablom var. type, başka bir tablonun adını içeren numaralandırılmış bir değerdir. join'u type tablosunun adıyla biçimlendirmek istiyorum. Örneğin :mysql koşullu birleştirme

switch($type) 
case 'table1': 
    join table1; 
    break; 
case 'table2': 
    join table2; 
    break; 

Bunu nasıl başarabiliriz?

cevap

4

çirkin yolu:

Masa Çeşitleri, T1, T2:

SELECT ... FROM Types, T1 , where Types.ID=T1.Types_ID AND Types.TYPE='TABLE1' 
UNION 
SELECT ... FROM Types, T2 , where Types.ID=T2.Types_ID AND Types.TYPE='TABLE2' 
+2

sadece "yol" değil midir mysqldiary.com başka mysql conditional joins örnek görebilirsiniz

e_id? Adımı kullanmayı bırak. – stevedbrown

+2

"A" yolu. Çirkin görünüyor, daha iyi olduğunu umuyordum. Ama sonra tekrar "SELECT * FROM X" ötesinde çoğu SQL, çirkin görünüyor bana;) –

+11

Steve kendinizle kavga etmeyi bırakın: P – Purefan

16

doğrudan bu olsa (çok güzel değil gibi o ... Yapabileceğiniz bir şey gibi bunu yapamaz .. .):

önce verilen bir yanıta ek olarak
SELECT 
t.id, 
t.type, 
t2.id AS id2, 
t3.id AS id3 

FROM t 
LEFT JOIN t2 ON t2.id = t.id AND t.type = 't2' 
LEFT JOIN t3 ON t3.id = t.id AND t.type = 't3' 
+0

t.type t2 ise mysql tablo t3'te bir satır arar mı? Bu güzel çözüm için – clime

+0

+1, ama işaret etmiş olabilirsiniz ki, bu koşulu "ON" maddesine koymanız hile yapar. Bu noktayı ilk olarak özledim ve bu sorgunun her iki tablodaki tüm satırları getirdiğini düşündüm (belki de tek bir anahtar kullanmazsanız, her defasında bir satırdan fazla) ve sonra yanlışlıkla JOIN'lenmiş olan sütunları görmezden gelmeniz gerekir. Ama bu şekilde, koşulun yanlış olduğu yerde NULL elde edersiniz. – AbcAeffchen

4

: Sen açıklamada IF kullanarak iki sol sonuçlarını katıldı birleştirebilirsiniz: EĞER (t.type = 't2', t2.id, t3.id) olarak typ Sen