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 :

GROUP BY et JOINTURE


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 188
    Points : 121
    Points
    121
    Par défaut GROUP BY et JOINTURE
    Bonjour,

    J'ai deux tables client et stock
    Dans ma table stock, j'enregistre les stock en fonction d'une date.
    Donc je voudrais resortir pour chaque client le dernier stock enregistré dans ma base de données, sachant qui 'est possible qu'un client n'ai pas encore de ligne de stock rattachée à lui.

    J'ai fait la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT A.IdClient, A.LibelleClient, 
      B.Stock, B.StockJour, B.StockMois, B.IdStock, B.DateCre,
      MAX(B.DateCre) as maxiDate 
    FROM client as A 
    LEFT OUTER JOIN stock_emailing as B on A.IdClient=B.IdClient 
    GROUP BY A.IdClient 
    HAVING B.DateCre = maxiDate 
      OR B.DateCre IS NULL 
    ORDER BY LibelleClient ASC
    Mon problème c'est que je n'ai pas de retour des client ayant un stock.
    Avez vous une solution ?
    Merci d'avance

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    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 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Il faut chercher la MAX(Date.cre) dans une sous-requête et mettre celle-ci en jointure externe avec la table stock_emailing pour récupérer les autres colonnes pour la maxiDate, cette dernière table étant aussi en jointure externe avec les clients pour récupérer les clients n'ayant pas de stock.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT c.IdClient, c.LibelleClient, 
        s.Stock, s.StockJour, s.StockMois, s.IdStock, s.DateCre
    FROM Client AS c
    LEFT OUTER JOIN stock_emailing AS s ON s.IdClient = c.IdClient
    LEFT OUTER JOIN (
        SELECT IdClient, MAX(DateCre) AS maxiDate
        FROM stock_emailing
        GROUP BY IdClient
    ) tmp ON tmp.IdClient = s.IdClient
        AND tmp.maxiDate = s.DateCre
    ORDER BY c.LibelleClient

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 188
    Points : 121
    Points
    121
    Par défaut
    Merci, mais j'ai encore un problème, si j'ai deux ligne de stock pour un client, les deux ressortent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT c.IdClient, c.LibelleClient, s.Stock, s.StockJour, s.StockMois, s.IdStock, s.DateCre
    FROM client AS c
    LEFT OUTER JOIN stock_emailing AS s ON s.IdClient = c.IdClient
    LEFT OUTER JOIN (
     
    SELECT IdClient, MAX( DateCre ) AS maxiDate
    FROM stock_emailing
    GROUP BY IdClient
    )tmp ON tmp.IdClient = s.IdClient
    AND tmp.maxiDate = s.DateCre
    ORDER BY LibelleClient ASC

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    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 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Au temps pour moi !
    Le second LEFT JOIN va retourner toutes les lignes de stock_emailing !

    Remplace le par un INNER JOIN, ça devrait aller mieux.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 188
    Points : 121
    Points
    121
    Par défaut
    Non ça ne va pas mieux
    J'ai plus mes clients qui n'ont pas de ligne dans la table stock_emailing

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    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 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Je dois être fatigué...

    Essaie dans ce sens alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT c.IdClient, c.LibelleClient, 
        s.Stock, s.StockJour, s.StockMois, s.IdStock, s.DateCre
    FROM Client AS c
    LEFT OUTER JOIN (
        SELECT IdClient, MAX(DateCre) AS maxiDate
        FROM stock_emailing
        GROUP BY IdClient
    ) tmp ON tmp.IdClient = c.IdClient
        LEFT OUTER JOIN stock_emailing AS s ON s.IdClient = tmp.IdClient
            AND tmp.maxiDate = s.DateCre
    ORDER BY c.LibelleClient
    Je joins d'abord la table client à la sous-requête qui détermine la maxiDate. Comme c'est une jointure externe à gauche, je vais avoir tous les clients, même s'ils n'ont pas de stock.
    Ensuite cette sous-requête est jointe à la table stock_emailing pour récupérer les autres colonnes de cette table.

    J'ai bon cette fois ?

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 188
    Points : 121
    Points
    121
    Par défaut
    non pas vraiment
    j'ai une magnifique erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Unknown column 's.IdClient' in 'on clause'

    moi aussi je suis fatigué

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    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 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    J'ai édité ma dernière requête juste après l'avoir publiée une première fois. Peut-être as-tu pris la mauvaise version parce qu'il y avait un problème au niveau des alias dans les jointures.

    A moins que tu n'aies effectivement pas de colonne nommée IdClient dans la table stock_emailing, auquel cas première requête serait fausse !

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 188
    Points : 121
    Points
    121
    Par défaut
    Effectivement ça marche maintenant.

    Merci beaucoup

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

Discussions similaires

  1. Group By et jointure
    Par Invité dans le forum Requêtes
    Réponses: 18
    Dernier message: 30/08/2013, 10h53
  2. Linq Group Vu et Jointure
    Par mdordenart dans le forum Linq
    Réponses: 0
    Dernier message: 22/08/2012, 14h22
  3. GROUP BY et JOINTURE ?
    Par ebaynaud dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/04/2009, 15h28
  4. [Oracle 9i] GROUP BY avec jointure.
    Par requinc dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/04/2006, 12h29
  5. Groupe By avec jointure
    Par batoubat dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/12/2005, 14h12

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