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

Langage SQL Discussion :

Une clause WHERE avant un LEFT JOIN ?


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 34
    Points : 32
    Points
    32
    Par défaut [Résolu]Une clause WHERE avant un LEFT JOIN ?
    Question bête : Es - ce correct de placer une clause WHERE avant une jointure ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT COUNT(fichesstocks.nbArticles) FROM fichesstocs,fournisseurs WHERE fournisseurs.idFournisseurs = fournisseurs.fichesStocks.idArticles LEFT JOIN ...
    A votre avis : Correct, ça passe, Autre solution (merci de votre proposition ), Totalement Berk.

    Merci d'avance à tous !

  2. #2
    Membre habitué Avatar de Cobaye
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 120
    Points : 154
    Points
    154
    Par défaut
    pour moi incorrect
    ordre :
    SELECT
    FROM
    JOINTURE
    WHERE
    ORDER BY
    Pro : http://www.ohweb.fr -> Spécialiste en développement de site e-commerce, Expert Prestashop
    perso : http://www.olecorre.com -> un dico de termes informatiques


    J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone. [Bjarne Stroustrup]

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 34
    Points : 32
    Points
    32
    Par défaut
    Merci Cobaye!

    En fait je vous explique le but de la manoeuvre :

    J'ai une table "fichesstocks" qui en fait contient des opérations de stocks de type entrée - sortie.

    une table "fournisseurs" contenant des infos sur le fournisseur, dans cette table le champs "delaisLivraison" (un entier représentant un nombre de jours) m'intéresse particulièrement.

    une table "articles" ou je récupère le nom, etc ...

    Ce que je dois récupérer, c'est par fournisseurs, tous les articles qu'il vend. Pour tous ces articles, le nombre de ventes dans un délai correspondant à fournisseurs.delaisLivraison. Et voilà, je la trouve très méchante celle là, et je n'arrive pas à la résoudre.

    Donc si vous avez des idées, n'hésitez pas ! Car là, je suis vraiment dans la semoule :'( !

  4. #4
    Membre habitué Avatar de Cobaye
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 120
    Points : 154
    Points
    154
    Par défaut
    faut y aller par étape :
    première étape :
    c'est par fournisseurs, tous les articles qu'il vend.
    SELECT idarticles, nomarticles, nomfournisseur FROM articles INNER JOIN fournisseurs ON articles.idfournisseur = fournisseurs.idfournisseur

    la tu a tous les articles par fournisseurs

    on rajoute le reste, le nombre d'articles sorties pour un delai donné

    SELECT count(fichesstocks.idarticles), idarticles, nomarticles, nomfournisseur, fournisseurs.delaisLivraison FROM articles INNER JOIN fournisseurs ON articles.idfournisseur = fournisseurs.idfournisseur LEFT JOIN fichesstocks ON articles.IdArticle = fichesstocks.idarticles
    GROUP BY idarticles, nomarticles, nomfournisseur
    HAVING fournisseurs.delaisLivraison = unevaleur

    voila en gros à quoi de ressembler ta requete d'après ce que j'ai compris
    Pro : http://www.ohweb.fr -> Spécialiste en développement de site e-commerce, Expert Prestashop
    perso : http://www.olecorre.com -> un dico de termes informatiques


    J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone. [Bjarne Stroustrup]

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 34
    Points : 32
    Points
    32
    Par défaut
    Merci cobaye pour ces explications. J'ai réussi à isoler les articles par fournisseurs, le seul problème, impossible de compter mon nombre d'articles vendu. Pour cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT F.nbArticles, A.idArticles, A.nom AS nomArticle, A.idFournisseurs, FO.nom AS nomFournisseur FROM articles  A, fichesstocks F, fournisseurs FO INNER JOIN fournisseurs ON (A.idfournisseurs = A.idfournisseurs) LEFT JOIN fichesstocks ON (A.idArticles = F.idArticles) WHERE A.idArticles = F.idArticles AND A.idFournisseurs = FO.idFournisseurs GROUP BY A.idArticles HAVING A.idFournisseurs = 8
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    96 - Pâte à modeler Terracota - Darwi - 0
    97 - Pâte à modeler Classic - Darwi - 0
    98 - Pâte à modeler Softy - Darwi - 0
    99 - Pâte à modeler Roc - Darwi - 0
    mais quand j'insère un count() dans le SELECT mysql m'envoie gentillement balader. que faire?

  6. #6
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Je ne suis pas certain d'avoir bien compris , mais ta requête est "bizarre", et ne devrait pas marcher (pas d'adéquation entre le SELECT et le GROUP BY)...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT F.nbArticles, A.idArticles, A.nom AS nomArticle, A.idFournisseurs, FO.nom AS nomFournisseur, COUNT(*)
    FROM articles  A INNER JOIN fournisseurs FO ON A.idFournisseurs = FO.idFournisseurs 
                     LEFT  JOIN fichesstocks F  ON A.idArticles = F.idArticles
    WHERE A.idFournisseurs = 8 
    GROUP BY F.nbArticles, A.idArticles, A.nom, A.idFournisseurs, FO.nom
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 34
    Points : 32
    Points
    32
    Par défaut
    Pourtant elle passe, malgré tout je pense comme toi qu'elle est chiadée.

    Bon je vais essayer de réexpliquer le problème plus explicitement.

    Une table fichesstocks contenant pour chaque flux de sortie ou d'achat d'article, un nombre d'articles (nbArticles). Ce qu'il faut, c'est que j'arrive à compter ce nombre pour chaque article d'un fournisseur (contenu dans la table fournisseurs). Une table article est également présente pour faire le lient entre tout ca.

    Ce qu'il faut que je parvienne à sortir c'est un resultSet de ce type :

    - Pour un fournisseur :
    - Pour chaque article de ce fournisseur :
    - Le nombre d'articles vendus sur une période de 7 jours par exemple. (définie par un champ dans la table fournisseurs).

    Voilà, et je n'y arrive malheureusement pas

  8. #8
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Essaye la requête que je t'ai fournie avec la condition de date en plus et cela devrait aller...
    Si cela ne marche pas, essaye de préciser en quoi.

    Explicite aussi ton modèle de données (les 3 tables) en ne mettant que les champs mis en cause et les clés. Parce que j'ai un gros doute sur nbArticles
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  9. #9
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Finalement je crois plus en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT A.idArticles, A.nom AS nomArticle, 
           A.idFournisseurs, FO.nom AS nomFournisseur, 
           SUM(F.nbArticles) AS NombreArticle
    FROM articles  A INNER JOIN fournisseurs FO ON A.idFournisseurs = FO.idFournisseurs 
                     LEFT  JOIN fichesstocks F  ON A.idArticles     = F.idArticles 
    WHERE A.idFournisseurs = 8 
    GROUP BY A.idArticles, A.nom, A.idFournisseurs, FO.nom
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  10. #10
    Membre habitué Avatar de Cobaye
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 120
    Points : 154
    Points
    154
    Par défaut
    et moi pense plus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT A.idArticles, A.nom AS nomArticle, 
           A.idFournisseurs, FO.nom AS nomFournisseur, 
           SUM(F.nbArticles) AS NombreArticle 
    FROM articles  A INNER JOIN fournisseurs FO ON A.idFournisseurs = FO.idFournisseurs 
                     LEFT  JOIN fichesstocks F  ON A.idArticles     = F.idArticles 
    GROUP BY A.idArticles, A.nom, A.idFournisseurs, FO.nom 
    HAVING A.idFournisseurs = 8
    Pro : http://www.ohweb.fr -> Spécialiste en développement de site e-commerce, Expert Prestashop
    perso : http://www.olecorre.com -> un dico de termes informatiques


    J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone. [Bjarne Stroustrup]

  11. #11
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    HAVING est pour mettre une condition sur le GROUP (sur le count du groupe par exemple), ici il s'agit d'une condition sur les Lignes. Inutile de fabriquer des GROUP pour tous les fournisseurs et n'en choisir qu'un à l'arrivée.
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 34
    Points : 32
    Points
    32
    Par défaut
    En essayant la requête de Médiat, cela fonctionne impeccable. Merci à Cobaye et Médiat ! Grâce à vous j'ai appris!

    Encore merci et à bientôt j'espère ! Je passe donc ce topic en Résolu !

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

Discussions similaires

  1. Utiliser un alias de colonne dans une clause Where MS SQL
    Par sir dragorn dans le forum Langage SQL
    Réponses: 11
    Dernier message: 12/10/2011, 09h31
  2. Réponses: 1
    Dernier message: 03/02/2006, 12h35
  3. fonction booleenne dans une clause where ?
    Par user_h dans le forum Oracle
    Réponses: 1
    Dernier message: 20/10/2005, 15h05
  4. [super requete] Dumper un model avec une clause where
    Par elievar dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/03/2005, 17h05

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