2009-08-10 7 views
15

J'ai une table id1, id2, type. type est une valeur énumérée contenant le nom d'une autre table. Je voudrais préformer un join avec le nom de la table de type. Par exemple:jointure conditionnelle dans mysql

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

Comment puis-je y parvenir?

Répondre

4

laid chemin:

Tableau Types, 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

est-ce pas tout simplement « le chemin »? Arrête d'utiliser mon nom. – stevedbrown

+2

C'est "A" façon. Il a l'air moche, j'espérais qu'il y avait un meilleur. Mais là encore la plupart des SQL au-delà de "SELECT * FROM X" me paraissent moche;) –

+11

Steve arrête de te battre avec toi-même: P – Purefan

16

Vous ne pouvez pas le faire directement comme ça ... vous pouvez faire quelque chose comme ça si (pas très joli .. .):

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

Est-ce que mysql recherche une ligne dans la table t3 si t.type est t2? – clime

+0

+1 pour cette belle solution, mais vous auriez pu faire remarquer, que mettre la condition dans la clause 'ON' fait l'affaire. J'ai d'abord manqué ce point et pensé que cette requête récupère toutes les lignes des deux tables (peut-être plus d'une rangée chacune, si vous n'utilisez pas une clé unique) et vous devez simplement ignorer les colonnes qui ont été jointes par erreur. Mais de cette façon, vous obtenez 'NULL's où la condition est fausse. – AbcAeffchen

4

en plus de réponse précédente: Vous pouvez combiner les deux gauche rejoint les résultats en utilisant l'instruction IF: IF (t.type = 't2', t2.id, t3.id) comme typé e_id

Vous pouvez voir un autre exemple mysql conditional joins à mysqldiary.com

Questions connexes