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 :

Pb avec jointures et somme


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Pb avec jointures et somme
    Bonjour à tous,
    Voici mon problème.
    J'ai 4 tables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    tbl_magasin     tbl_produit    tbl_stock       tbl_vente
       no_mag          cod_pro        no_mag          no_mag
       cumul                          cod_pro         cod_pro
                                      qte             qte
    J'ai plusieurs magasins. Pour un magasin cumul peut être à 0 ou 1.
    Pour un produit je peux ne pas avoir de stock ni de vente.
    Je voudrais afficher par produit pour lequel tbl_magasin.cumul=1
    les stock et les ventes.
    J'ai commencé à écraire ma requête là je bloque.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select 
    tbl_produit.cod_pro,
    sum(tbl_stock.qte) as stock,
    sum(tbl_vente.qte) as vente
    from tbl_produit
           left outer join tbl_stock on tbl_stock.cod_pro=tbl_produit.cod_pro
           letf outer join tbl_vente on tbl_vente_cod_pro=tbl_produit.cod_pro
    ??? comment faire intervenir no_magasin et cumul ???

    Quelqu'un pourra-il avoir l'amabilité de m'aider ?
    D'avance merci.
    Txoovlis

  2. #2
    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
    Saluton,
    Pourrais-tu être un peu plus lisible s'agissant de structures de table et nous donner les colonnes sur lesquelles sont censées porter les relations.
    Merci
    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)

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Excuse-moi.
    Voici les colonnes de mes tables
    tbl_magasin : no_mag,cumul
    tbl_produit : cod_pro
    tbl_stock : no_mag,cod_pro,qte
    tbl_vente : no_mag,cod_pro,qte

  4. #4
    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
    Tu as un souci pour faire les jointures, car tu n'accèdes au magasin à partir du produit qu'en passant soit par les stocks, soit par les ventes.
    Comme, conceptuellement, ce qui a été vendu a procédé du stock d'un magasin on se dit que ça va le faire.
    Essaye comme çà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT p.cod_pro,
               SUM(s.qte) AS stock,
               SUM(v.qte) AS vente,
    FROM tbl_produit AS p
    LEFT JOIN tbl_stock AS s ON s.cod_pro=p.cod_pro
    LEFT JOIN tbl_vente  AS v ON v.cod_pro=p.cod_pro
    LEFT JOIN tbl_magasin AS m 
                 ON m.no_mag=s.no_mag OR m.no_mag=v.no_mag
    WHERE m.cumul=1
    Bon, le OR m.no_mag=v.no_mag dans la clause de jointure devrait nous faire faire une crise d'urticaire, mais je trouve amusant de l'essayer.
    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)

  5. #5
    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
    En y réfléchissant, le WHERE m.cumul=1 rend inutile les LEFT JOIN.
    En effet, si la jointure ne s'opère pas, m.cumul sera NULL et la ligne de produit ne sera pas retournée.
    Donc on pourrait se contenter de INNER JOIN.
    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)

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    J'ai essayé mais ça marche bizarrement.
    D'abord j'ai ajouté le group by p.cod_pro sinon il ne m'affiche pas tous les produits

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT p.cod_pro,
               SUM(s.qte) AS stock,
               SUM(v.qte) AS vente,
    FROM tbl_produit AS p
    LEFT JOIN tbl_stock AS s ON s.cod_pro=p.cod_pro
    LEFT JOIN tbl_vente  AS v ON v.cod_pro=p.cod_pro
    LEFT JOIN tbl_magasin AS m 
                 ON m.no_mag=s.no_mag OR m.no_mag=v.no_mag
    WHERE m.cumul=1
    Avec le OR il m'affiche bien tous mes produits, mais les quantités sont fausses
    J'ai remplacé le OR par le AND je n'ai plus tous les produits et je n'ai plus toutes mes quantités vendues

  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 txoovlis Voir le message
    J'ai essayé mais ça marche bizarrement.
    D'abord j'ai ajouté le group by p.cod_pro sinon il ne m'affiche pas tous les produits
    Oui, bravo parce que sur ce coup là on était vraiment boulets.
    Citation Envoyé par txoovlis Voir le message
    Avec le OR il m'affiche bien tous mes produits, mais les quantités sont fausses
    J'ai remplacé le OR par le AND je n'ai plus tous les produits et je n'ai plus toutes mes quantités vendues
    Je t'avais prévenu que ça risquait d'être folklo cette jointure à 3.
    Donc, a priori, tu as certains produits qui ont été vendus mais qui ne sont pas connus en stock pour ce magasin et réciproquement.
    Bref, c'est le souk !
    Je crains qu'il ne nous faille passer par deux sous-requêtes dans la clause SELECT, ce qui est très lourd en charge pour le serveur.
    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
    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
    Et comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT p.cod_pro,
               (SELECT SUM(s.qte) 
                FROM tbl_stock AS s
                LEFT JOIN tbl_magasin AS m
                    ON m.no_mag=s.no_mag
                WHERE s.cod_pro=p.cod_pro
                AND m.cumul=1) AS stock,
               (SELECT SUM(v.qte)
                FROM tbl_vente AS v 
                LEFT JOIN tbl_magasin AS m1
                ON m1.no_mag=v.no_mag
                WHERE v.cod_pro=p.cod_pro
                AND m1.cumul=1) AS vente
    FROM tbl_produit AS p
    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)

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Ca marche !!!
    Mais un peu long. un peu plus de 3 secondes pour 3268 produits.
    Merci beaucoup

  10. #10
    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
    Je t'avais prévenu, les sous-requêtes corrélées c'est très gourmand.
    Vérifie que toutes les colonnes qui participent aux jointures et aux corrélations sont bien des index dans chacune des tables, ça pourrait accélérer le bouzin.
    Mais je présume que c'est déjà le cas.
    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)

  11. #11
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Il serait peut-être plus efficace de faire deux requêtes, une pour chacune des sommes (à tester quoi).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT p.cod_pro, SUM(s.qte*m.cumul) 
    FROM tbl_produit AS p
    LEFT JOIN tbl_stock AS s ON s.cod_pro=p.cod_pro
    LEFT JOIN tbl_magasin AS m ON m.no_mag=s.no_mag
    GROUP BY p.cod_pro
    ORDER BY p.cod_pro
    Et de même pour les ventes. C'est un peu moins pratique mais avec le tri le rapprochement entre les deux listes ne devrait pas être trop difficile. Ce serait probablement plus rapide avec des INNER JOIN et en partant des magasins (afin de filtrer directement ceux qui ne sont pas à cumuler), mais dans ce cas un produit qui n'apparait dans aucun stock cumulé ne sera pas listé.

    D'un autre côté, si c'est pour être utilisé tel quel je suppose qu'il faut une unique requête, mais dans ce cas elle n'a pas forcément besoin d'être excessivement rapide. J'ai un peu de mal à juger de si les 3 secondes sont normales... Je serais tenté que c'est un peu lent pour des tables indexées mais bon. Les sous-requêtes devraient fonctionner à l'identique avec des INNER JOIN, reste à voir ce que ça peut faire gagner.

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

Discussions similaires

  1. requete avec jointure & group by
    Par de LANFRANCHI dans le forum Langage SQL
    Réponses: 9
    Dernier message: 27/07/2004, 14h31
  2. Mise à jour avec jointure
    Par taupain dans le forum Bases de données
    Réponses: 5
    Dernier message: 09/07/2004, 11h27
  3. Mise à jour de table impossible après requête avec jointure
    Par sto dans le forum Bases de données
    Réponses: 5
    Dernier message: 17/03/2004, 13h24
  4. Script avec JOINTURE et CASE
    Par Labienus dans le forum Langage SQL
    Réponses: 6
    Dernier message: 27/02/2004, 09h40
  5. problème de requête avec jointures
    Par tinhat dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/08/2003, 10h33

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