Aller au contenu

Double-jointure?


Hyogapag

Sujets conseillés

Bonjour,

je ne vais pas rentrer dans les détails de ma base, mais on peut résumer le problème comme suit:

Considérons une liste de voyageurs. Soient les champs suivants pour chaque voyageur :

id

nom

origine

destination

Les valeurs des champs origine et destination sont des codes postaux. Je voudrais afficher le nom de la commune. Pour cela, je crée une base nommée communes, avec les champs

code_postal

nom_commune

Il me faut faire deux fois la jointure pour que le nom de la ville d'origine et de destination s'affichent.

Pour l'instant ma requpete ressemble à ceci

SELECT * FROM voyageurs v, communes o, communes d WHERE v.origine=o.code_postal AND v.destination=d.code_postal

Cette requête n'affiche que le nom de la ville de destination (la dernière demandée). Dans ma boucle while mysql_fetch_assoc, je ne peux pas préciser o.code_postal ou d.code_postal, je peux seulement dire code_postal.

Je ne parviens pas à trouver la syntaxe correcte pour réaliser cette "double jointure".

PS : en fait j'ai le même problème dès qu'un champ d'une table possède un homonyme dans une autre table à joindre, mais j'ai résolu ce problème en ajoutant des préfixes aux noms des champs.

Lien vers le commentaire
Partager sur d’autres sites

Et si tu mettais

SELECT o.code_postal, d.code_postal FROM voyageurs v, communes o, communes d WHERE v.origine=o.code_postal AND v.destination=d.code_postal

Sinon, évite le * quand tu ne récupères pas toutes les infos de ta base.

C'est mieux de ne récupérer que ce dont on a besoin.

Lien vers le commentaire
Partager sur d’autres sites

Tu peux modifier les noms de champs retournés par ta requète pour les exploiter par un mysql_fetch_assoc, en les forçant par un "as" :

SELECT o.code_postal [b]as codepostal1[/b], d.code_postal [b]as codepostal2 [/b]
FROM voyageurs v, communes o, communes d
WHERE v.origine=o.code_postal AND v.destination=d.code_postal

Lien vers le commentaire
Partager sur d’autres sites

Posté (modifié)

Merci pour vos réponses. En fait, j'avais déjà essyaé le "AS" mais à chaque fois PHP me retourne "Query failed". Voici ma requête exacte (j'ai vérifié scrupuleusement le nom des champs/tables).

$requete = "
SELECT
p.id,
p.nom,
p.nom_url,
p.divinite_protectrice,
p.classe,
p.protecteur,
p.surplis,
p.fonction,
p.age,
p.taille,
p.poids,
p.anniversaire,
p.groupe_sanguin,
p.pays_origine,
p.lieu_entrainement,
p.techniques,
p.commentaire,
p.fiche_detaillee,
c.id as classe_id,
c.nom as classe_nom,
c.nom_url as classe_nom_url,
d.id as divi_id,
d.nom as divi_nom,
d.nom_url as divi_nom_url,
o.id as o_id,
o.nom as o_nom,
o.nom_url as o_nom_url,
e.id as e_id,
e.nom as e_nom,
e.nom_url as e_nom_url
FROM
personnages p,
classes c,
divinites_protectrices d,
lieux o,
lieux e
WHERE
p.classe=classe_id
AND p.divinite_protectrice=divi_id
AND p.pays_origine=o_id
AND p.lieu_entrainement=e_id";

Modifié par Portekoi
Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Ton where n'est pas bon. Tu ne spécifie que des champs sans la table à laquelle ils appartiennent :

WHERE
p.classe=c.classe_id
AND p.divinite_protectrice=d.divi_id
AND p.pays_origine=o.id
AND p.lieu_entrainement=e.id";

Tu as mis des '_' à la place de '.' :)

Portekoi

Lien vers le commentaire
Partager sur d’autres sites

Hummm... en fait je pensais que dans le WHERE il fallait utiliser l'alias du champ que j'avais défini dans le select. Or o.id AS o_id... Mais maintenant ça marche. Merci beaucoup :)

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...