2009-08-10 22 views
15

Mam tabelę id1, id2, type. type jest wyliczoną wartością zawierającą nazwę innej tabeli. Chciałbym wykonać preformę join z nazwą tabeli type. Na przykład:dołączanie warunkowe w mysql

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

Jak mogę to osiągnąć?

Odpowiedz

4

brzydki sposób: Rodzaje

stołowe, 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

Czy to nie jest po prostu „droga”? Przestań używać mojego imienia. – stevedbrown

+2

To jest "A". Wygląda brzydko, miałem nadzieję, że było lepiej. Ale znowu większość SQL poza "SELECT * FROM X" wygląda na brzydkiego;) –

+11

Steve przestaje walczyć ze sobą: P – Purefan

16

Nie można zrobić to bezpośrednio tak ... można zrobić coś takiego (to jednak nie bardzo ładna .. .):

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

Czy mysql szuka wiersza w tabeli t3, jeśli t.type to t2? – clime

+0

+1 za to ładne rozwiązanie, ale można było zauważyć, że umieszczenie warunku w klauzuli "ON" rozwiązuje problem. Po raz pierwszy opuściłem ten punkt i uważałem, że to zapytanie pobiera wszystkie wiersze z obu tabel (może więcej niż jeden wiersz, jeśli nie używasz unikalnego klucza), a następnie po prostu trzeba zignorować kolumny, które przez pomyłkę były JOIN. Ale w ten sposób otrzymasz 'NULL's, gdzie warunek jest fałszywy. – AbcAeffchen

4

W uzupełnieniu do poprzedniej odpowiedzi: można połączyć dwa z lewej dołącza wyniki za pomocą instrukcji if: IF (t.type = 't2', t2.id, t3.id) jako typ e_id

Można zobaczyć inny mysql conditional joins przykład w mysqldiary.com