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 :

Inner join imbriqués, sauriez-vous m'expliquer svp ?


Sujet :

Requêtes MySQL

  1. #1
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut Inner join imbriqués, sauriez-vous m'expliquer svp ?
    Bonjour tout le monde,

    J'ai une chaine sql :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT *
    FROM ingredient 
    INNER JOIN (
      recette INNER JOIN detail_recette ON recette.id = detail_recette.ref_recette
    ) ON ingredient.id = detail_recette.ref_ingredient 
    WHERE recette.id = 5
    Sauriez-vous un peu m'expliquer en détail comment elle fonctionne svp ?

    Cela est très important pour la compréhension du reste de mon exercice.

    Un tout grand merci d'avance.

    beegees

  2. #2
    Membre chevronné Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Points : 2 232
    Points
    2 232
    Par défaut
    Apparemment tu as 3 tables : ingredient, recette, detail_recette. La table ingredient possède une clé étrangère vers la table detail_recette et la table detail_recette possède une clé étrangère vers la table recette.
    Le premier INNER JOIN permet de lier la table ingredient à la table detail_recette le second de lier recette à detail_recette.
    La requête te permet de récupérer tous les ingrédients concerné par une recette donnée.
    autant l'hiver éclate que l'hétéroclite
    le vrai geek c'est celui qui croit qu'il y a 1024 mètres dans un kilomètre

  3. #3
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par guigui5931 Voir le message
    Apparemment tu as 3 tables : ingredient, recette, detail_recette. La table ingredient possède une clé étrangère vers la table detail_recette et la table detail_recette possède une clé étrangère vers la table recette.
    Le premier INNER JOIN permet de lier la table ingredient à la table detail_recette le second de lier recette à detail_recette.
    La requête te permet de récupérer tous les ingrédients concerné par une recette donnée.
    Salut,

    Merci pour ta réponse.

    Apparemment tu as 3 tables : ingredient, recette, detail_recette.
    Exactement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    La table ingredient possède une clé étrangère vers la table detail_recette et la table detail_recette possède une clé étrangère vers la table recette.
    La table detail_recette contient une clé étrangère vers la table recette et vers la table ingrédient.

    La table detail_recette contient donc ces champs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    id
    ref_recette
    quantite
    ref_ingredient
    Le premier INNER JOIN permet de lier la table ingredient à la table detail_recette
    ok

    le second de lier recette à detail_recette
    ok

    La requête te permet de récupérer tous les ingrédients concerné par une recette donnée
    ok

    ça me semble clair, merci beaucoup.

    beegees

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    C'est quand même curieux comme façon d'écrire les jointures, et pour le moins trompeur .
    On obtient la même chose et de façon plus lisible comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
    FROM ingredient 
    INNER JOIN detail_recette ON ingredient.id = detail_recette.ref_ingredient
    INNER JOIN recette ON detail_recette.ref_recette = recette.id
    WHERE recette.id = 5
    C'est peut-être un exercice pour s'y perdre . En tout cas, il vaut mieux prendre de bonnes habitudes dans l'écriture des jointures... Avec des jointures internes, ça va, mais dès qu'il y aura des jointures externes, bonjour l'embrouillade .

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  5. #5
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Bonjour Ced et bonne année,

    Merci pour ta réponse et sorry pour le retard de la mienne.

    Avec ta requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT * 
    From ingredient 
      INNER JOIN detail_recette ON ingredient.id = detail_recette.ref_ingredient
      INNER JOIN recette ON detail_recette.ref_recette = recette.id 
    Where recette.id = 10
    j'obtiens ce message d'erreur :

    Erreur de syntaxe (opérateur absent) dans l'expression 'ingredient.id = detail_Recette.ref_ingredient INNER JOIN recette ON detail_recette.ref_recette = recette.id
    Je dois donc continuer avec ma chaine sql tout en sachant que la tienne est plus lisible.

    beegees

  6. #6
    Membre régulier
    Homme Profil pro
    Médecin.
    Inscrit en
    Septembre 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Médecin.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2008
    Messages : 96
    Points : 94
    Points
    94
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT * 
    From ingredient 
      INNER JOIN detail_recette ON ingredient.id = detail_recette.ref_ingredient
      INNER JOIN recette ON detail_recette.ref_recette = recette.id 
    Where recette.id = 10
    A tu essayé ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    From ingredient 
      INNER JOIN detail_recette ON ingredient.id = detail_recette.ref_ingredient
      INNER JOIN recette ON detail_recette.ref_recette = recette.id and recette.id = 10
    J'ai moi même eu quelques soucis avec des jointures externes et cette syntaxe les a résolu.

    Cordialement.

  7. #7
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Citation Envoyé par faraudch Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    From ingredient 
      INNER JOIN detail_recette ON ingredient.id = detail_recette.ref_ingredient
      INNER JOIN recette ON detail_recette.ref_recette = recette.id and recette.id = 10
    J'ai moi même eu quelques soucis avec des jointures externes et cette syntaxe les a résolu.
    Saluton,
    Sauf que cette syntaxe qui mélange les clauses de filtrage avec les clauses de jointure n'est vraiment pas à recommander.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  8. #8
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut

    Alors là, je ne comprends pas l'erreur que tu récupères...
    Ca doit être les excès de champagne , mais c'est pourtant une requête tout ce qu'il y a de plus bête...

    Sinon, pour la position de la condition (entre la clause WHERE et dans la condition de jointure), l'effet est strictement le même sur les jointures internes (ce qui est le cas ici) et, dans ce cas, comme le dit si justement Maljuna Kris , il vaut alors mieux conserver la condition WHERE pour éviter les confusions...
    Là où ça change, et faraudch a raison de le souligner, c'est dès qu'on utilise des jointures externes.
    Tout est expliqué en détail dans cet excellent tutoriel .

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 28/12/2008, 11h48
  2. [DOM] Sauriez-vous m'expliquer ce script svp ?
    Par beegees dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 28/10/2008, 21h36
  3. Réponses: 10
    Dernier message: 18/05/2008, 18h23
  4. Serveur ftp pouvez vous m'expliquer svp
    Par fred59 dans le forum Dépannage et Assistance
    Réponses: 2
    Dernier message: 07/12/2006, 18h37

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