[SQL] Problème de jointure

Répondre
Partager Rechercher
Bonjour le labo,

N'ayant plus fait de sql depuis des années, je galère un peu sur un problème pourtant basique https://jolstatic.fr/forums/jol/images/smilies/frown.gif

Je vous en livre ici une version "simplifiée" (en vrai, la requête est plus compliqué = plus de tables, mais le principe est identique)
J'ai 3 tables
- voiture (id_voiture, modele, numero_assurance)
- conducteur (id_conducteur, nom, telephone)
- voiture_pilote (id_voiture, id_conducteur)

Attendu qu'une même voiture peut avoir plusieurs conducteurs (ou aucun).
Attendu qu'un conducteur peut avoir plusieurs voitures (ou aucune).

Je cherche à obtenir la liste des voitures (sans doublon, donc une même voiture ne peut apparaitre qu'une seule fois). Même s'il n'y a pas de conducteur associé, et même s'il y a plusieurs conducteurs (je veux le premier conducteur trouvé dans la table voiture_pilote, ou même n'importe lequel).

Ma requête actuelle :

Code:
SELECT v.id_voiture, v.modele, v.numero_assurance
FROM voiture v
LEFT JOIN voiture_pilote AS p WHERE v.id_voiture = p.id_voiture
LEFT JOIN conducteur as c WHERE p.id_conducteur = c.id_conducteur
ORDER BY v.id_voiture
La requête retourne des résultats, mais ça me renvoie une même voiture autant de fois qu'il y a de conducteurs associés.

Help ! https://jolstatic.fr/forums/jol/images/smilies/frown.gif
J'ai pas bien pigé l'énoncé je crois, mais bon :

Si tu veux les voitures d'un pilote :
Code:
select distinct v.id_voiture from voiture v, voiture_pilote vp
where v.id_voiture = vp.id_voiture 
and vp.id_conducteur = ?
Si tu veux la liste des voitures uniquement wtf ? simple select de la table voitures non ? Ou bien il faut que la voiture ait un pilote absolument ? Dans ce cas même chose...
Code:
select distinct v.id_voiture from voiture v, voiture_pilote vp
where v.id_voiture = vp.id_voiture
Citation :
Publié par Asterra
Si tu veux simplement la liste des voitures, pourquoi t'embêtes tu avec une jointure?
Parce que si la voiture a un pilote (et la plupart en ont un, et seulement un), je veux son nom et son tel°.

- Si la voiture a un (et un seul) pilote, je veux le nom du pilote
- Si la voiture n'a pas de pilote, je veux quand même le modèle de la voiture
- Si la voiture a pls pilotes, je veux le nom d'un des pilotes (et un seul)
Code:
select v.modele, c.nom from voiture v left join(
  select vp0.* from voiture_pilote vp0
  left join voiture_pilote vp1 on vp0.id_voiture = vp1.id_voiture and vp0.id_pilote < vp1.id_pilote
  where vp1.id_voiture is null
) as vp on vp.voiture_id = v.voiture_id
left join conducteur c on c.conducteur_id = vp.conducteur_id ;
En gros la sous-requête récupère 1 pilote par voiture "pilotée". Suffit ensuite de faire un left join dessus pour récupérer aussi les voitures qui n'ont pas de pilotes.

Devrait fonctionner

Dernière modification par Votre pseudo ici ; 15/05/2012 à 15h38. Motif: Requête complète
Citation :
Publié par Votre pseudo ici
Code:
select * from voiture v0 left join (
  select * from voiture_pilote vp where vp.id_voiture = v0.id_voiture limit 1
) vp on v0.voiture_id = vp.voiture_id;
De la marge pour optimiser mais l'idée est là, si j'ai bien compris.
Sauf que tu n'auras pas les voitures qui n'ont pas de pilote, si je ne me trompe pas.
Normalement si, mais faudrait essayer.

J'edit la requête, une erreur s'est glissée (référencement d'un champ de la super requête dans une requête dérivée)

Mis à jour

Dernière modification par Votre pseudo ici ; 15/05/2012 à 15h28.
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés