Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/06/2011, 16h39   #1
Membre régulier
 
Inscription : janvier 2004
Messages : 440
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 440
Points : 89
Points : 89
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 :
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.
sheira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 17h02   #2
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
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 :
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.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 17h12   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 007
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 007
Points : 18 275
Points : 18 275
Envoyer un message via MSN à CinePhil
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 :
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
Citation:
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.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 09h34   #4
Membre régulier
 
Inscription : janvier 2004
Messages : 440
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 440
Points : 89
Points : 89
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
Citation:
where a.IDGammeProduit= 1
elle me retourne tous les articles, mon where ne fonctionne pas .
sheira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 09h39   #5
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 007
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 007
Points : 18 275
Points : 18 275
Envoyer un message via MSN à CinePhil
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 ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 14h17   #6
Membre régulier
 
Inscription : janvier 2004
Messages : 440
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 440
Points : 89
Points : 89
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 ?
sheira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 14h25   #7
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 007
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 007
Points : 18 275
Points : 18 275
Envoyer un message via MSN à CinePhil
Si le besoin est juste celui-ci :
Citation:
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 :
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'
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 14h40   #8
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

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

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
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
__________________
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)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 13h21   #9
Membre régulier
 
Inscription : janvier 2004
Messages : 440
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 440
Points : 89
Points : 89
Merci pour tout!
sheira est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h16.


 
 
 
 
Partenaires

Hébergement Web