2009-08-10 16 views
15

Tengo una tabla id1, id2, type. type es un valor enumerado que contiene un nombre de otra tabla. Me gustaría preformar un join con el nombre de la tabla de type. Por ejemplo:condicional unirse en mysql

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

¿Cómo puedo lograr esto?

Respuesta

4

fea manera: Tipos

de mesa, 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

No es eso simplemente "el camino"? Deja de usar mi nombre – stevedbrown

+2

Es una forma "A". Se ve feo, esperaba que hubiera algo mejor. Pero la mayoría de SQL más allá de "SELECT * FROM X" me parece feo;) –

+11

Steve deja de pelear contigo mismo: P – Purefan

16

Usted no puede hacerlo directamente al igual que ... se puede hacer algo como esto, sin embargo (no muy bonita .. .):

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

¿mysql busca una fila en la tabla t3 si t.type es t2? – clime

+0

+1 para esta buena solución, pero podría haber señalado, que poner la condición en la cláusula 'ON 'hace el truco. Primero omití ese punto y pensé que esta consulta obtiene todas las filas de ambas tablas (tal vez más de una fila cada una, si no usas una clave única) y luego solo tienes que ignorar las columnas que fueron 'UNIDAS' por error. Pero de esta manera obtienes 'NULL's donde la condición es falsa. – AbcAeffchen

4

Además de la respuesta anterior: Se pueden combinar los dos izquierda se une a los resultados mediante el uso de IF: IF Ttipo = 'T2' (, t2.id, t3.id) como típico e_id

Se puede ver otro ejemplo en mysql conditional joins mysqldiary.com