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 :

Jointure sur une table de relation


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 46
    Points : 39
    Points
    39
    Par défaut Jointure sur une table de relation
    Bonjour,

    Mon cerveau doit avoir un problème car je n'arrive pas a réaliser la requête dont j'ai besoin alors que je sais que c'est possible.

    J'ai 3 tables, une contenant la liste des produits, une la liste des journées et une contenant les ventes.

    Petit schéma:



    Je souhaite obtenir par produit et par journée la somme des quantités vendue.

    Ma requête fonctionne pour peu que j'ai au moins 1 produits par journée de vendu, mais si ce n'est pas le cas, je souhaiterai avoir une ligne avec le produit et la date avec un total de 0. Hors pour le moment je n'ai tout simplement pas de ligne.

    Voici la requête que j'ai écrite jusqu'ici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    SELECT
        produit.libelle,
        produit.id,
        journee.date,
        SUM(vente.qte) AS tot_qte
    FROM
        produit
    LEFT OUTER JOIN vente
        ON
            vente.idProduit = produit.id
    LEFT OUTER JOIN journee
        ON
            journee.id = vente.idJournee
    GROUP BY
        journee.date,
        produit.libelle
    ORDER BY
        produit.id,
        journee.date
    J'ai essayé en faisant un produit cartésien entre les produits et les journées... mais visiblement ce n'est pas une idée vu que sa fait crash mon pc ^^

    Quelqu'un pourrait-il me mettre sur la voie svp ?

    Merci d'avance.

    Cordialement,
    orion99.
    Images attachées Images attachées  

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    Vous n'etes pas loin, c'est juste vos jointure externes qui ne sont pas dans le bon sens :

    Le plus simple, comme vous voulez la liste complète des jours, serait de partir de la table des jours :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    SELECT
        produit.libelle,
        produit.id,
        journee.date,
        COALESCE(SUM(vente.qte), 0) AS tot_qte
    FROM    journee 
    LEFT OUTER JOIN vente
                    INNER JOIN produit                     
                        ON  journee.id = vente.idJournee
        ON        vente.idProduit = produit.id
    GROUP BY
        produit.libelle,
        produit.id,
        journee.date
    ORDER BY
        produit.id,
        journee.date
    Mais a priori, vous pourriez aussi, à partir de votre requête, faire une jointure externe droite au lieu de gauche sur votre table des journées

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 46
    Points : 39
    Points
    39
    Par défaut
    Cette requête à une tête sympathique même si je ne comprend pas bien cette jointure dans une jointure...

    Néanmoins elle ne fonctionne pas

    Voici l'erreur que j'obtiens (c'est MySQL si sa peu aidé): #1054 - Unknown column 'journee.id' in 'on clause'

    Que faire ?

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    en effet, j'ai inversé les deux condition de jointure

    Il fallait écrire :
    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
        produit.libelle,
        produit.id,
        journee.date,
        COALESCE(SUM(vente.qte), 0) AS tot_qte
    FROM    journee 
    LEFT OUTER JOIN vente
                    INNER JOIN produit                     
    
                          ON        vente.idProduit = produit.id
        ON  journee.id = vente.idJournee
    GROUP BY     produit.libelle,     produit.id,     journee.date ORDER BY     produit.id,     journee.date
    Il s'agit simplement de jointures imbriquées : on peut faire une jointure interne entre vente et produit, mais si l'on imbrique pas les jointure comme ceci, les lignes dans journée n'ayant pas de correspondance dans vente seront éliminées par une jointure interne classique sur la table produit. Il faudrait alors de nouveau faire une jointure externe sur produit.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 46
    Points : 39
    Points
    39
    Par défaut
    D'accord je comprend.

    La requête fonctionne, j'entends par là pas d'erreurs. Malheureusement ce n'est pas encore le résultat souhaité

    Je l’exécute une première fois, je trouve des ventes de coca pour le 03/03. J'efface toutes les ventes de coca pour cette journée. Je ré-exécute la requête... et la ligne de résultat concernant le 03/03 à disparu plutôt qu'être toujours là avec un total de 0.

    Quand j'y réfléchit... j'ai l'impression que c'est logique... On demande de joindre à la journée des produits en passant par des ventes. Hors... il n'existe pas dans vente de lignes faisant le lien entre le coca et la journée du 03/03 vu que je les ai toutes effacée. En conséquence... le lien n'existe pas, comment le moteur SQL pourrait-il faire une jointure dans ce cas ?

    J'ai ré-essayé avec un produit cartésien et hormis le fait que c'est horriblement lent là par contre j'obtiens bien les lignes même avec un total de 0.

    Si quelqu'un à une idée je suis preneur, mais moi je vois pas

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    oui, il faut faire un produit cartésien entre journee et produit, puis une jointure externe avec les ventes :

    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
        produit.libelle,
        produit.id,
        journee.date,
        COALESCE(SUM(vente.qte), 0) AS tot_qte
    FROM    journee 
    CROSS JOIN produit
    LEFT OUTER JOIN vente
        ON    vente.idProduit = produit.id
        AND   vente.idJournee = journee.id 
    GROUP BY     produit.libelle,     produit.id,     journee.date 
    ORDER BY     produit.id,     journee.date

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 46
    Points : 39
    Points
    39
    Par défaut
    M'y attendais ^^ bon... ce que je ferai c'est stocker le résultat de la requête dans une table pour permettre l'accès aux stats sans attendre une éternité ^^

    Merci pour l'aide

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

Discussions similaires

  1. [1.x] save() impossible sur une table en relation n:n
    Par etoileweb dans le forum Symfony
    Réponses: 10
    Dernier message: 14/11/2010, 18h59
  2. [AC-2003] Requête UPDATE sur une table sans relation
    Par SIGER_971 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 09/07/2009, 09h02
  3. Requete Auto jointure sur une table
    Par Guillaume 78 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 28/11/2007, 09h26
  4. Plusieurs jointures sur une table
    Par Tchupacabra dans le forum Langage SQL
    Réponses: 5
    Dernier message: 21/09/2006, 15h23
  5. [MySQL] Jointure sur une table déjà jointe
    Par genova dans le forum Requêtes
    Réponses: 3
    Dernier message: 18/10/2005, 23h54

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