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 :

MIN() MAX() avec jointure et GROUP BY ?


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Webmarketer
    Inscrit en
    Novembre 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmarketer

    Informations forums :
    Inscription : Novembre 2015
    Messages : 22
    Points : 28
    Points
    28
    Par défaut MIN() MAX() avec jointure et GROUP BY ?
    Bonjour,

    je n'arrive pas à utiliser MIN() et MAX() sur le schéma simplifié suivant :
    Table ARTICLE (id)
    Table DECLINAISON(id, article_id)
    Table PRIX(id, declinaison_id, prix)

    Un Article a plusieurs Déclinaisons qui ont chacune un Prix.

    Je veux récupérer pour chaque article le prix minimum, donc le prix minimum parmi les déclinaisons de ce produit.

    Merci de votre précieuse aide !

    Cdt

  2. #2
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 057
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 057
    Points : 9 396
    Points
    9 396
    Par défaut
    Je ne comprends pas l'organisation de tes 3 tables.
    On ne va donc pas se pencher sur le Prix mini ou maxi, c'est prématuré. On va simplement chercher à afficher des choses cohérentes.

    Est-ce qu'une requête comme celle-ci a un sens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select   a.id , d.article_id,  p.declinaison_id , p.prix
    from article a 
     inner join  declinaison d  on d.id = a.id 
     inner join prix p on p.id = a.id
    Ou peut--être celle-ci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select   d.article_id ,  p.declinaison_id  , p.prix
    from article a 
     inner join  declinaison d  on d.article_id = a.id 
     inner join prix p on p.declinaison_id = d.id
    Ou peut-être une autre ?
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Webmarketer
    Inscrit en
    Novembre 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmarketer

    Informations forums :
    Inscription : Novembre 2015
    Messages : 22
    Points : 28
    Points
    28
    Par défaut
    oui désolé j'aurai dû mettre la requête.

    Celle qui correspond est la seconde.

  4. #4
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 057
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 057
    Points : 9 396
    Points
    9 396
    Par défaut
    Ok, donc on a fait déjà 70% du boulot.
    Quand on a une requête qui permet d'afficher toutes les données, et qu'on veut des groupes, la règle quasi-systématique, c'est :

    Etape 1.
    Les seules choses qu'on va changer , c'est ce qu'il y a avant le FROM, et on va ajouter un GROUP BY à la fin.
    Le from et les join .. on n'y touche plus.

    On a donc ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select   ???
    from article a 
     inner join  declinaison d  on d.article_id = a.id 
     inner join prix p on p.declinaison_id = d.id
    Group by ???
    On s'occupe d'abord du group by
    On veut une ligne pour chaque a.id ... et c'est le seul critère.
    On arrive donc à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select   ???
    from article a 
     inner join  declinaison d  on d.article_id = a.id 
     inner join prix p on p.declinaison_id = d.id
    Group by a.id
    Les trucs qu'on a mis dans le Group by, on les met aussi dans la première ligne, parce qu'on veut les voir affichés.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select   a.id
    from article a 
     inner join  declinaison d  on d.article_id = a.id 
     inner join prix p on p.declinaison_id = d.id
    Group by a.id
    Et dans la première ligne, on peut maintenant ajouter plein de données calculées, et uniquement des données calculées, donc uniquement des données à base de MIN, AVG, MAX, COUNT , STDDEV ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select   a.id , min ( p.prix) as PRIX_MINI, Max  ( p.prix) as prix_maxi,  count(*) as nbre_declinaisons,  avg(prix) as Prix_moyen 
    from article a 
     inner join  declinaison d  on d.article_id = a.id 
     inner join prix p on p.declinaison_id = d.id
    Group by a.id

    Et il faut toujours procéder dans cet ordre : une requête qui affiche tout. S'assurer que cette requête est bonne. Puis ne plus toucher aux clauses FROM ou JOIN, et adapter pour avoir le résultat voulu.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Webmarketer
    Inscrit en
    Novembre 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmarketer

    Informations forums :
    Inscription : Novembre 2015
    Messages : 22
    Points : 28
    Points
    28
    Par défaut
    Merci pour ces explications très claires, mais ... il y a un mais ... Avoir le prix mini maxi j'y étais arrivé : ce que je veux, c'est l'id de la table Prix qui a le prix maxi , et l'id de Prix qui a le mini.

    J'avoue ne pas avoir bien expliqué ma question !

    Merci de ton aide.

  6. #6
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 057
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 057
    Points : 9 396
    Points
    9 396
    Par défaut
    Je connais peu MySQL. Sous oracle, il y a une syntaxe avec dense_rank .. qui permet de faire ça "directement" ; je ne vois pas de syntaxe similaire avec mysql. J'ai trouvé des trucs en utilisant une variable ... A toi de voir en cherchant MySql Dense_rank.

    Sinon, je ferais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select X.id, x. prix_mini, P.declinaison_id 
    from  
    ( select   a.id , min ( p.prix) as PRIX_MINI
    from article a 
     inner join  declinaison d  on d.article_id = a.id 
     inner join prix p on p.declinaison_id = d.id
    Group by a.id 
     ) X  inner join  prix p  on p.prix = X.prix_mini
    Inconvénient : si il y a 2 déclinaisons qui sont 1ères ex-aequo pour un produit, on aura les 2 lignes. On peut le résoudre en compliquant encore un peu plus la requête.
    Peut-être que des spécialistes de Mysql auront mieux.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

Discussions similaires

  1. Requete avec Jointure et groupe
    Par coeurdange dans le forum SQL
    Réponses: 5
    Dernier message: 10/06/2015, 17h25
  2. UPDATE avec Jointure, clause GROUP BY et HAVING
    Par bilbot dans le forum Développement
    Réponses: 3
    Dernier message: 19/01/2012, 14h12
  3. Réponses: 16
    Dernier message: 20/01/2011, 12h45
  4. Update avec jointure et group by
    Par olibara dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/11/2010, 10h18

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