Page 1 sur 1

2 jointures su une meme table

Posté : 08 juin 2006, 18:39
par atovik
Bonjour je voudrais savoir si c'est possible de faire deux jointures sur une meme table , je m'explique

j'ai une table VOLS(avions) , et une table Aeroports, dans la table VOLS j'ai un champ id_aeroport_depart et un autre id_aeroport_arrivee

voici ma requete :
SELECT vols.id_vol, vols.numero_vol, vols.vol, vols.id_companie, companies.companie, vols.date_vol, vols.heure_depart,
vols.heure_arrivee, vols.id_aeroport_depart, aeropports.aeroport as a_depart, vols.id_aeroport_arrivee,aeropports.aeroport as a_arriv, vols.id_ville_depart, vols.id_ville_arrivee,
vols.id_pays_depart, vols.id_pays_arrivee, vols.nbre_places, vols.prix_adulte, vols.prix_enfant, vols.prix_bebe,
vols.promotion, vols.charter, vols.franchise_bagage
FROM vols

left join companies on companies.id_companie = vols.id_companie

left join aeropports as aero_arriv on aero_arriv.id_aeroport =vols.id_aeroport_arrivee

left join aeropports on aeropports.id_aeroport = vols.id_aeroport_depart

WHERE vols.id_ville_depart = 6 AND vols.id_ville_arrivee = 42 AND vols.date_vol = '2006-06-08'
le probleme c'est que ma reqte me retourne le meme aeroport pour le depart et l'arrivée ...

Merci d'avance

Posté : 08 juin 2006, 19:29
par Hubert Roksor
Pour commencer tu devrais donner des aliases courts à toutes tes tables pour rendre la requête plus lisible. Quelque chose comme "vols v, companies c, aeropports ad, aeropports aa" (ad = "aéroport départ", aa = "aéroport arrivée"). Ensuite, je ne vois aucune mention de "aero_arriv" dans la clause SELECT donc c'est normal que tu n'aies aucune info sur l'aéroport d'arrivée.

Posté : 08 juin 2006, 19:59
par Cyrano
Suggestion à tester reprenant en outre la remarque faite par Hubert Roksor à propos des alias :

Code : Tout sélectionner

SELECT v.id_vol, v.numero_vol, v.vol, v.id_companie, c.companie, v.date_vol, v.heure_depart, v.heure_arrivee, v.id_aeroport_depart, a1.aeroport AS a_depart, v.id_aeroport_arrivee, a1.aeroport AS a_arriv, v.id_ville_depart, v.id_ville_arrivee, v.id_pays_depart, v.id_pays_arrivee, v.nbre_places, v.prix_adulte, v.prix_enfant, v.prix_bebe, v.promotion, v.charter, v.franchise_bagage FROM vols AS v, companies AS c, aeropports AS a1, aeropports AS a2 WHERE c.id_companie = v.id_companie AND a2.id_aeroport = v.id_aeroport_arrivee AND a1.id_aeroport = v.id_aeroport_depart AND v.id_ville_depart = 6 AND v.id_ville_arrivee = 42 AND v.date_vol = '2006-06-08';
Personnellement, je ne vois pas l'intérêt majeur d'une jointure gauche, donc des clauses WHERE peuvent parfaitement suffire puisque tu ne recherches que des lignes ayant des correspondances dans la jointure.

À tester donc...

Posté : 08 juin 2006, 20:06
par atovik
Merci pour vos reponse

ca me renvoi exactement ce que ma requete m'a renvoyé :(

Posté : 08 juin 2006, 20:13
par Cyrano
Il faudrait un jeu d'essai pour tester en local sur des tables simplifiées sur juste trois ou quatre champs... :-k

Posté : 08 juin 2006, 20:18
par atovik
c'est ce que j'ai fait mais ca me renvoie toujours le meme aeroport en depart et en arrivée

Code : Tout sélectionner

SELECT v.id_vol, a1.aeroport AS a_depart, a1.aeroport AS a_arriv FROM vols AS v, aeropports AS a1, aeropports AS a2 WHERE a2.id_aeroport = v.id_aeroport_arrivee AND a1.id_aeroport = v.id_aeroport_depart AND v.id_ville_depart = 6 AND v.id_ville_arrivee = 42 AND v.date_vol = '2006-06-08';

Posté : 08 juin 2006, 20:21
par Vorkosigan
C'est peut etre un peu normal, non ?

Code : Tout sélectionner

SELECT v.id_vol, a1.aeroport AS a_depart, a1.aeroport AS a_arriv
:roll:

Posté : 08 juin 2006, 20:35
par Cyrano
bien vu, mais la première requête était bonne.

COmme j'ai dit, il faudrait un jeu d'essai avec quelques données permettant de faire une requête en local : dans l'abstraction, c'est un peu ardu quand même...

Posté : 08 juin 2006, 20:37
par atovik

Code : Tout sélectionner

SELECT v.id_vol, a1.aeroport AS a_depart, a2.aeroport AS a_arriv FROM vols AS v, aeropports AS a1, aeropports AS a2 WHERE a2.id_aeroport = v.id_aeroport_arrivee AND a1.id_aeroport = v.id_aeroport_depart AND v.id_ville_depart = 6 AND v.id_ville_arrivee = 42 AND v.date_vol = '2006-06-08';
les alias type a1 a2 sont bien oui mais à utiliser avec precautions :P
il fallait utiliser A2 pour l'arrivée pas a1

Merci