2010-09-29 7 views
3

Je déteste l'admettre par ma connaissance de MySQL qui manque aux requêtes plus complexes. Essentiellement, j'ai quatre tables dont deux contiennent les données que je veux retourner, et deux sont des tables relationnelles reliant les données. Table A est présent uniquement pour fournir une charge pour Table D.aID.Mysql JOIN de quatre tables avec deux tables clés

+--------+ +--------+ +--------+ +-----------+ +-----------+ 
|Table A | |Table B | |Table C | | Table D | | Table E | 
+---+----+ +---+----+ +---+----+ +---+---+---+ +---+---+---+ 
|aID|name| |bID|name| |cID|name| |dID|aID|bID| |eID|dID|cID| 
+---+----+ +---+----+ +---+----+ +---+---+---+ +---+---+---+ 
| 1 | a_1| | 1 | b_1| | 1 | c_1| | 1 | 1 | 1 | | 1 | 1 | 1 | 
+---+----+ | 2 | b_2| | 2 | c_2| | 2 | 1 | 2 | | 1 | 1 | 2 | 
      +---+----+ | 3 | c_3| +---+---+---+ +---+---+---+ 
         +---+----+ 

La relation créée avec ces tables est: Table A > Table B > Table C. Les données que je souhaite appartiennent à la catégorie Table B > Table C.

+--------+---------+--------+---------+ 
|tblB.bID|tblB.name|tblC.cID|tblC.name| 
+--------+---------+--------+---------+ 
| 1 | a_1 | 1 | c_1 | 
| 1 | a_1 | 2 | c_2 | 
| 2 | a_2 | NULL | NULL | 
+--------+---------+--------+---------+ 

Cependant, pour assurer que je suis la bonne voie, je dois saisir l'Table B de la relation Table A > Table BTable C appartient. Je me rends compte que je rends les choses beaucoup plus difficiles pour moi-même en permettant des valeurs name en double, mais je préfère avoir des petites tables et des requêtes plus complexes que des tableaux gonflés et des requêtes plus simples. La requête que j'utilise est

SELECT * FROM `Table E` 
LEFT JOIN `Table D` ON (`Table B`.bID = `Table D`.bID) 
RIGHT JOIN `Table E` ON (`Table D`.dID = `Table E`.dID)) 
RIGHT JOIN `Table C` ON (`Table E.cID = `Table C`.cID); 

Cependant, jusqu'à présent, cela n'a pas fonctionné. Lorsque la requête est soumise, cette erreur est renvoyée:

ERROR 1066 (42000): Not unique table/alias: 'Table D' 

Des idées sur la façon dont cela fonctionne? Est-ce seulement possible?

+1

Comme vous avez mentionné vouloir des requêtes simples (et depuis vos colonnes clés ont un nom correspondant) vous souhaitera peut-être envisager de remplacer 'sur (tablex.xID = tabley.xID)' 'avec l'aide xID'. –

+0

Je ne savais pas que je pouvais le faire. Merci pour ce conseil. –

Répondre

0

Grâce à Martin Smith, j'ai pu trouver la solution que je poste ici. J'espère que cela pourrait aider quelqu'un d'autre.

SELECT tblB.bID, 
    tblB.name, 
    tblC.cID, 
    tblC.name 
FROM Table E 
RIGHT JOIN Table B ON (Table B.bID = Table D.bID) 
RIGHT JOIN Table D USING dID 
RIGHT JOIN Table C USING cID; 
1

La requête que vous soumettez présente peu de ressemblance avec la structure de table que vous nous avez donnée! Qu'est-ce que Table D.national_regionID? Ou modx.coverage_state?

Généralement, cependant, ne mélangez pas les jointures gauche et droite. Chaque table utilisée dans la requête doit également suivre le FROM ou suivre un JOIN. Vous semblez utiliser Table B et Table C dans des conditions de jointure sans jamais les ajouter à la requête.

+0

'Table D.national_regionID' et' modx.coverage_state' étaient des restes de la requête réelle restante d'une recherche et d'un remplacement ayant échoué. Donc, vous dites la requête devrait ressembler à quelque chose de similaire à ceci: \t SELECT * FROM 'Table e' \t' Table RIGHT JOIN B' ON ('' Tableau B'.bID = Tableau D'.bID) \t DROIT JOIGNEZ la 'Table D' en utilisant' dID' \t DROIT JOIGNEZ 'Table C' en utilisant' cID'; –

+0

Je voudrais vous remercier pour votre réponse. Après avoir écrit ma réponse initiale, j'ai jeté un autre coup d'œil à ma requête, et j'ai essayé de la faire ressembler à ce qu'elle semblait devoir être. Ce faisant, j'ai résolu mon erreur en utilisant la requête que j'ai posté ci-dessus et je la re-posterai dans un fil de réponse. –