2011-02-09 4 views
1

J'ai plusieurs tables auxquelles je suis joint et dont j'ai besoin pour ajouter une autre table et je n'arrive pas à obtenir la bonne requête. Voici ce que j'ai maintenant -MySQL: Jointure de plusieurs colonnes sur plusieurs tables

Tableau 1
carid, catid, makeid, modelID, CarYear

Tableau 2
makeid, makename

Tableau 3
modelID, modelname

Tableau 4
catid, catname

La requête J'utilise pour se joindre à eux est: Maintenant

SELECT * FROM table1 a 
    JOIN table2 b on a.makeid=b.makeid 
    JOIN table3 c on a.modelid=c.modelid 
    JOIN table4 d on a.catid=d.catid 
    WHERE a.carid = $carid; 

je dois ajouter une 5ème table que je reçois d'une 3ème partie que j'ai du mal à ajouter à ma requête existante. La nouvelle table a ces champs -

Tableau 5 id, année, marque, modèle, citympg, hwympg

J'ai besoin citympg et hwympg basé sur CarYear à partir du tableau 1, makename à partir du tableau 2 et modelname de tableau 3. Je sais que je peux faire une deuxième requête avec ces valeurs, mais je préférerais faire une seule requête et avoir toutes les données dans une seule ligne. Cela peut-il être fait dans une seule requête? Si c'est le cas, comment?

Répondre

2

Il est possible d'avoir plus qu'une condition dans une jointure. cela fonctionne-t-il?

SELECT a.*, e.citympg, e.hwympg 
FROM table1 a 
    JOIN table2 b on a.makeid=b.makeid 
    JOIN table3 c on a.modelid=c.modelid 
    JOIN table4 d on a.catid=d.catid 
    Join table5 e on b.makename = e.make 
       and c.modelname = e.model 
       and a.caryear = e.year 
    WHERE a.carid = $carid; 

... bien que votre question ne soit pas claire. Avez-vous seulement voulez joindre la table5 aux autres, ou y avait-il autre chose que vous vouliez faire avec table5?

+0

@Jim Garrison: Oups, pense que c'est corrigé maintenant. – FrustratedWithFormsDesigner

+1

Je pense que Frustrated signifiait 'sur un.caryear = e.year' au lieu de' sur un.citympg = e.citympg et un.hwympg = e.hwympg' –

+0

@ypercube: euh, ouais, ... c'est ce que je voulais dire ! – FrustratedWithFormsDesigner

1

Sans index, il ne sera pas efficace, mais vous pouvez le faire

LEFT JOIN table5 ON (table2.make = table5.make AND table3.model = table5.model AND table1.caryear = table5.caryear) 

Cela suppose aussi la marque et les modèles et les chaînes ans correspondent exactement.

+1

D'accord, et je pense que vous pouvez avoir des ennuis si le nom est comme "Escorte" dans un, "escorte" dans un autre et "Escorte" (espace à la fin) dans un troisième. Vous pouvez vouloir réduire les espaces et les convertir en majuscules ou en minuscules pour la comparaison. – Don

+0

Les marques et les modèles sont tous présentés sous forme de sélections déroulantes et celles-ci sont normalisées avant d'être insérées dans la table, ce qui permet de minimiser les problèmes de correspondance. –

Questions connexes