IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Jointure ou sous requête obligatoirement?


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2009
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 133
    Points : 117
    Points
    117
    Par défaut Jointure ou sous requête obligatoirement?
    Bonjour,

    J'ai deux tables voiture(id_voiture, libelle_voiture) et pilote(id_pilote, libelle_pilote). Une voiture peut être conduite par plusieurs pilotes et un pilote peut conduire plusieurs voitures. J'ai donc une table associative voiture_pilote(id_voiture, id_pilote)

    Je veux une requête qui pour une voiture donnée, me remonte tous les pilotes qui n'ont pas encore été associés à cette voiture précise.

    Je ne m'en sors pas avec une jointure gauche.

    Quelle approche auriez vous?

    Cordialement,
    Ionesco.

  2. #2
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 641
    Points
    4 641
    Par défaut
    salut,

    peux tu nous montrer les requêtes que tu as essayé?

    merci

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2009
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 133
    Points : 117
    Points
    117
    Par défaut
    Citation Envoyé par Cybher Voir le message
    salut,

    peux tu nous montrer les requêtes que tu as essayé?

    merci
    Oui bien sûr, j'aurai dû la mettre dès le départ.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	 SELECT p.id_pilote
    FROM pilote p
    LEFT JOIN voiture_pilote vp ON vp.id_pilote = p.id_pilote
    WHERE p.pilote_id IS NULL OR ( vp.voiture_id != 40
    AND p.pilote_id IS NOT NULL)
    Le problème se trouve dans le OR. Le premier prédicat permet de remonter les pilotes qui ne sont affectés à aucune voiture, et le deuxième prédicat normalement devait permettre de remonter les pilotes qui sont dans voiture_pilote mais pas pour la voiture en question.

    Merci.

  4. #4
    Membre averti Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Points : 301
    Points
    301
    Par défaut
    Salut.

    Un truc de ce style ne fonctionne pas ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select id_pilote from pilote p left join voiture_pilote vp on vp.id_pilote = p.id_pilote
    where 
    vp.id_pilote is null and vp.id_voiture = Ma_Voiture
    define: Programmeur : Celui qui résout un problème que vous n'aviez pas, d'une façon que vous ne comprenez pas.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2009
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 133
    Points : 117
    Points
    117
    Par défaut
    Citation Envoyé par GyZmoO Voir le message
    Salut.

    Un truc de ce style ne fonctionne pas ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select id_pilote from pilote p left join voiture_pilote vp on vp.id_pilote = p.id_pilote
    where 
    vp.id_pilote is null and vp.id_voiture = Ma_Voiture
    Bonjour GyZmoO,

    Votre requête me renvoie un résultat vide. Elle remonte les pilotes associés à Ma_Voiture (donc on n'a pas la vérification du prédication vp.id_pilote is null puisque à aucun moment je n'ai la valeur NULL dans vp.id_pilote. Pourtant ça me semblait être le rôle de la jointure gauche!)

    Merci.

  6. #6
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 641
    Points
    4 641
    Par défaut
    essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT p.id_pilote
    FROM pilote p
    LEFT JOIN voiture_pilote vp ON vp.id_pilote = p.id_pilote and vp.voiture_id = 40
    WHERE vp.pilote_id IS NULL

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Août 2009
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 133
    Points : 117
    Points
    117
    Par défaut
    Citation Envoyé par Cybher Voir le message
    essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT p.id_pilote
    FROM pilote p
    LEFT JOIN voiture_pilote vp ON vp.id_pilote = p.id_pilote and vp.voiture_id = 40
    WHERE vp.pilote_id IS NULL
    Excellent!

    Ca me remonte les bons résultats.
    Pourrais-tu m'expliquer si tu as le temps ce qu'implique de mettre l'identifiant de la voiture recherchée au niveau de la jointure?

    Merci beaucoup.

  8. #8
    Membre averti Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Points : 301
    Points
    301
    Par défaut
    Ahhhhh.

    Le fait de "jointer" voiture_pilote & pilote avec une jointure externe, va renvoyer les résultats tels que :

    - Si un pilote a au moins conduit une voiture, on va renvoyer les champs de voiture_pilote & pilote associés.

    - Si un pilote n'a jamais conduit AUCUNE voiture, (i.e dans la table voiture_pilote, l'identifiant du pilote en question n'apparaît pas), alors on va renvoyer des lignes avec comme valeur de champ de pilote_id dans voiture_pilote = null

    Par conséquent, la requête que j'ai donné, fonctionnerait si vous recherchiez uniquement les pilotes qui n'ont jamais conduit aucune voiture.

    Ce qui fait que le fait de mettre vp.id_pilote is NULL dans le where ne sert ici à "rien".

    Le fait dans filtrer sur l'id de la voiture au moment de la jointure permet de palier à ce problème, et du coup, le "where vp.id_pilote is null" fonctionne de la manière attendue.

    Suis-je dans le vrai?
    define: Programmeur : Celui qui résout un problème que vous n'aviez pas, d'une façon que vous ne comprenez pas.

Discussions similaires

  1. Jointure et sous-requête
    Par otmaneo01 dans le forum SQL
    Réponses: 0
    Dernier message: 06/06/2015, 18h55
  2. jointure et sous requête
    Par armellita dans le forum Requêtes
    Réponses: 2
    Dernier message: 29/01/2015, 19h02
  3. [Débutant] Jointure ou sous-requête ?
    Par Domi2 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 17/10/2014, 13h16
  4. Réponses: 2
    Dernier message: 15/05/2014, 18h04
  5. sous requêtes et jointures externes
    Par Harpoon dans le forum Requêtes
    Réponses: 4
    Dernier message: 03/05/2007, 19h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo