2010-12-04 7 views
4

J'ai trois tables table1, table2 et table2. table1.parent_id est l'identifiant d'un enregistrement dans table2 ou table3, en fonction de la valeur de table1.parent_type. Maintenant, je veux rejoindre table1 avec table2 et table3, en fonction de la valeur de table1.parent_type.MySQL join - Sélectionnez la table en fonction de la condition

Cela peut être fait en utilisant UNION. Mais y a-t-il une autre méthode?

Ceci est ma requête en cours

(SELECT c.*, a.title 
FROM table1 c 
LEFT OUTER JOIN table2 a 
ON c.parent_id = a.id 
WHERE c.parent_type = 0) 
UNION (SELECT c.*, p.title 
FROM table1 c 
LEFT OUTER JOIN table3 p 
ON c.parent_id = p.id 
WHERE c.parent_type = 1) 
ORDER BY id DESC 
LIMIT 10 

Mise à jour: Ceci est une autre méthode (De la réponse de Dark Falcon)

SELECT c.*, IF(c.parent_type = 0, a.title, p.title) as title FROM table1 c 
LEFT OUTER JOIN table2 a ON c.parent_id = a.id AND c.parent_type = 0 
LEFT OUTER JOIN table3 p ON c.parent_id = p.id AND c.parent_type = 1 
WHERE a.id IS NOT NULL OR p.id IS NOT NULL ORDER BY id DESC LIMIT 10; 

Mise à jour 2: Je PROFILES les requêtes avec profileur de requête. La jointure multi-tables est plus de 100 fois plus rapide pour tous mes tests.

+0

Quelle est la probabilité qu'un parent_id ait des enregistrements dans les deux types? Si c'est le cas, voulez-vous voir les deux ou l'une de ces valeurs de titre? –

+0

Ce sera soit table2 ou table2, pas les deux. Il y aura un et un seul enregistrement. –

+0

soit table2 ou table2 mais toujours table2 –

Répondre

4

Ceci est un peu difficile sans le schéma, mais quelque chose dans ce sens devrait fonctionner. Notez que vous pouvez mettre n'importe quelle condition dans la clause ON de la jointure. Pourquoi souhaitez-vous éviter l'UNION?

SELECT c.*, a.title FROM 
table1 c 
LEFT OUTER JOIN table2 a 
    ON c.parent_id = a.id AND c.parent_type = 0 
LEFT OUTER JOIN table3 p 
    ON c.parent_id = p.id AND c.parent_type = 1 
WHERE a.id IS NOT NULL OR p.id IS NOT NULL 
ORDER BY id DESC LIMIT 10 
+0

Je voulais juste savoir s'il y avait de meilleures options? –

+0

Définir "mieux"? Vous ne nous donnez pas beaucoup de travail. Quel est le problème avec l'UNION? –

+0

Tout d'abord, je voulais savoir de différentes façons d'y parvenir. Ensuite, je voulais choisir la requête qui était la plus rapide. –

Questions connexes