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 :

Requête left join


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 488
    Points : 134
    Points
    134
    Par défaut Requête left join
    Bonjour,

    Voilà ma requête ci-dessous ne ramène pas les bonnes infos .

    Je m'emmêle un peu les pinceau avec les left join et left outer join, à mon avis ma requête est fausse au niveau de la ligne "gamme produit".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Select
    distinct(Commande.IDCommande),
    Right(Commande.DateCommande,2) + '/' + Mid(Commande.DateCommande,5,2) + '/' + Left(Commande.DateCommande,4) + ' - ' + Coalesce(Commande.NumeroCommande, ' ')  + ' - ' + Coalesce(Client.RaisonSociale, ' ')  + ' - ' + Coalesce(Agencecommerciale.raisonsociale, '')
    FROM
    Commande
    Left join Client on (Commande.IDClient = Client.IDClient)
    Left join AgenceCommerciale on (Commande.IDAgenceCommerciale = AgenceCommerciale.IDAgenceCommerciale)
    Left join CommandeLigne on (Commande.IDCommande = CommandeLigne.IDCommande)
    Left join Article on (CommandeLigne.IDArticle = Article.IDArticle)
    Left OUTER JOIN GammeProduit   on (Article.IDGammeProduit = GammeProduit.IDGammeProduit) WHERE  Article.IDGammeProduit= '1'
    Merci d'avance pour votre aide.

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    LEFT JOIN et LEFT OUTER JOIN c'est la même chose, à mon avis le problème s'est l'utilisation du WHERE ou tu filtres des lignes ce qui revient à utiliser une jointure interne avec la table Article.
    Il faut placer la condition de filtre dans le ON, enfin je suppose que c'est ça le problème car tu ne le décris pas :
    Un exemple ici du phénomène :
    Jointure externe et condition de restriction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT DISTINCT(Commande.IDCommande),
           RIGHT(Commande.DateCommande,2) + '/' + Mid(Commande.DateCommande,5,2) + '/' + LEFT(Commande.DateCommande,4) + ' - ' + Coalesce(Commande.NumeroCommande, ' ')  + ' - ' + Coalesce(Client.RaisonSociale, ' ')  + ' - ' + Coalesce(Agencecommerciale.raisonsociale, '')
      FROM Commande
      LEFT JOIN Client ON (Commande.IDClient = Client.IDClient)
      LEFT JOIN AgenceCommerciale ON (Commande.IDAgenceCommerciale = AgenceCommerciale.IDAgenceCommerciale)
      LEFT JOIN CommandeLigne ON (Commande.IDCommande = CommandeLigne.IDCommande)
      LEFT JOIN Article ON (CommandeLigne.IDArticle = Article.IDArticle and Article.IDGammeProduit= '1')
      LEFT JOIN GammeProduit ON (Article.IDGammeProduit = GammeProduit.IDGammeProduit)
    PS : utilise des alias.

  3. #3
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Beaucoup de choses à corriger dans cette requête !

    1) DISTINCT opère sur toute la ligne donc inutile d'essayer de mettre une colonne entre parenthèses, ça n'aura aucun effet !

    => Pourquoi avoir mis un DISTINCT ? Quel est son but ?

    2) La partie RIGHT, MID, LEFT sur une colonne de date ressemble à un formatage d'une date SQL au format français.

    => Il existe DATE_FORMAT pour faire cela plus simplement !

    3) La suite du formatage de date fait une concaténation de plusieurs colonnes.
    On s'approche de la cosmétique, qui n'est pas vraiment le boulot du SGBD mais celui du logiciel qui présente les données.

    4) Dans cette partie, je vois un COALESCE sur le numéro de commande.
    Comme la table des commandes est la table à gauche de toutes les jointures externe, tous les numéros de commandes seront retournés.

    => Y a t-il des commandes sans numéro ?
    => Idem d'ailleurs pour les autres COALESCE ! Sont-ils vraiment utiles ?

    4) Inutile de mettre les conditions de jointures entre parenthèses.
    Au passage, LEFT JOIN ou LEFT OUTER JOIN, c'est pareil !

    5) L'utilisation d'alias pour les tables rend l'écriture et la lecture de la requête plus facile.
    Ainsi que l'indentation de la requête.

    6) IDGameProduit semble être un identifiant de type entier, comme il se doit.
    => Inutile de mettre la valeur cherchée entre apostrophes !

    7) Mettre une restriction dans le WHERE portant sur une table située à droite d'une jointure externe gauche est équivalent à faire un INNER JOIN sur cette table, comme je l'explique dans mon blog.

    => Il faut déplacer cette restriction dans la condition de jointure.

    Voici la requête récrite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT DISTINCT Cmd.IDCommande,
        DATE_FORMAT(cmd.DateCommande, '%d/%m/%Y'),
        COALESCE(cmd.NumeroCommande, ' '),
        COALESCE(clt.RaisonSociale, ' ') AS client
        COALESCE(ac.raisonsociale, '') AS agence_commerciale
    FROM Commande cmd
    LEFT OUTER JOIN Client clt ON cmd.IDClient = clt.IDClient
    LEFT OUTER JOIN AgenceCommerciale ac ON cmd.IDAgenceCommerciale = ac.IDAgenceCommerciale
    LEFT OUTER JOIN CommandeLigne cl ON cmd.IDCommande = cl.IDCommande
        LEFT OUTER JOIN Article a ON cl.IDArticle = a.IDArticle
            LEFT OUTER JOIN GammeProduit gp ON a.IDGammeProduit = gp.IDGammeProduit 
                AND a.IDGammeProduit= 1
    ma requête ci-dessous ne ramène pas les bonnes infos
    À part les remarques faites ci-dessus, je ne vois pas de problème grave dans cette requête.
    N'ayant pas de boule de cristal, je ne peux pas savoir quel était le résultat attendu, quel est le résultat obtenu ni à partir de quel jeu de données au départ. Merci d'éclairer ma lanterne sur ce point si tu veux une aide efficace.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 488
    Points : 134
    Points
    134
    Par défaut
    Tout d'abord merci pour vos réponses!

    skuatamad:

    Je peux mettre mon critère que dans le where, j'avais pensé à ta solution.

    Cinephil:

    Je mets le select parce qu'il me retourne 2 fois le même numéro de commande sinon j'ai des doublons si plusieurs articles ont été définis pour une commande.

    Effectivement, tous les coalesce n'étaient pas nécéssaires.

    Et la requête,même après avoir pris en compte vos remarques ne me retourne toujours pas les bon enregistrement pour un article et une gamme de produit renseignée.

    Si je mets
    where a.IDGammeProduit= 1
    elle me retourne tous les articles, mon where ne fonctionne pas .

  5. #5
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Bis repetita :
    Citation Envoyé par CinéPhil
    7) Mettre une restriction dans le WHERE portant sur une table située à droite d'une jointure externe gauche est équivalent à faire un INNER JOIN sur cette table, comme je l'explique dans mon blog.

    => Il faut déplacer cette restriction dans la condition de jointure.

    N'ayant pas de boule de cristal, je ne peux pas savoir quel était le résultat attendu, quel est le résultat obtenu ni à partir de quel jeu de données au départ. Merci d'éclairer ma lanterne sur ce point si tu veux une aide efficace.
    Sans les éléments indiqués en gras, on ne peut pas t'aider davantage.

    Citation Envoyé par Sheira
    Je peux mettre mon critère que dans le where
    Pourquoi ?

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 488
    Points : 134
    Points
    134
    Par défaut
    Commande :
    Commande.IDCommande = 1
    Commande.IDAgenceCommerciale = 2
    Commande.IDClient = 3


    CommandeLigne:

    CommandeLigne.IDCommandeLigne =1
    CommandeLigne.IDCommande = 1
    CommandeLigne.IDArticle = 2

    Article:

    Article.IDArticle = 2
    Article.IDGammeProduit = 1
    Article.Designation = "Article1"

    GammeProduit:

    GammeProduit.IDGammeProduit =1
    GammeProduit.Designation = "Gamme1"


    Comment récupérer les commandes appartenant à la Gamme 1 et concernant l'artcle Article1 ?

  7. #7
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Si le besoin est juste celui-ci :
    Comment récupérer les commandes appartenant à la Gamme 1 et concernant l'artcle Article1 ?
    La précision concernant l'appartenance à la gamme est implicite à partir de l'article, donc inutile.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT cmd.IDCommande
    FROM Commande cmd
    INNER JOIN CommandeLigne cl ON cl.IDCommande = cmd.IDCommande
        INNER JOIN Article a ON a.IDArticle = cl.IDArticle
    WHERE a.Designation = 'Article1'

  8. #8
    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 : 73
    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 CinePhil Voir le message
    La précision concernant l'appartenance à la gamme est implicite à partir de l'article, donc inutile.
    ????
    Tu peux développer Cinephil, STP ?
    [edit]Oups, au temps pour moi. je viens de capter

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 488
    Points : 134
    Points
    134
    Par défaut
    Merci pour tout!

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

Discussions similaires

  1. Requête LEFT JOIN ON si condition
    Par gnain dans le forum Développement
    Réponses: 5
    Dernier message: 30/01/2015, 13h34
  2. Problème requête LEFT JOIN
    Par absot dans le forum Requêtes
    Réponses: 2
    Dernier message: 30/05/2011, 01h20
  3. [WD14] Requête LEFT join
    Par devdev dans le forum WinDev
    Réponses: 4
    Dernier message: 16/02/2010, 12h29
  4. Pb de requête LEFT JOIN
    Par ofostier dans le forum Requêtes
    Réponses: 5
    Dernier message: 24/06/2008, 11h03
  5. [Access2003]-Perte de données requête left join
    Par alcabk dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 11/10/2007, 12h45

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