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 :

GROUP BY (produits et groupes produits)


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 9
    Points : 2
    Points
    2
    Par défaut GROUP BY (produits et groupes produits)
    Bonjour,

    version MYSQL : 5.0.68

    J'ai une table produit. Chaque produit appartient a une categorie.
    Ce que je cherche a faire :

    Recuperer les lignes produits les moins chers de chaque categorie, le tout groupé par categorie.

    Voila ma requete (qui renvoie pas forcement le produit le moins cher) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT `PRO_Id`, `PRO_GRO_Id`, `PRO_PrixEuro`, `PRO_EstEnPromo`
    FROM  `produits` 
    GROUP BY PRO_GRO_Id
    ORDER BY  `PRO_Id` ASC 
    LIMIT 0 , 20
    ou PRO_GRO_Id est la categorie

    Par avance, je vous remercie pour votre aide, qui va m'etre précieuse.

    Niko

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Vous avez un besoin similaire et une réponse adaptée dans le fil située juste en-dessous du votre.
    http://www.developpez.net/forums/d65...e/#post3857178

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    J'en suis arrivé la, mais cette requete ne renvoie pas les lignes attendues.

    Elle renvoie le produit le moins cher si ce produit a un Id inferieur au aux produits de le meme categorie, sinon le produit n'apparait pas du tout dans les resultats...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT e.PRO_Id, e.PRO_GRO_Id, e.PRO_PrixEuro, e.PRO_EstEnPromo
    FROM produits AS e
    INNER JOIN (
     
    SELECT PRO_Id, MIN( PRO_PrixEuro ) AS PrixMini
    FROM  `produits` 
    GROUP BY PRO_GRO_Id
    )tmp ON e.PRO_Id = tmp.PRO_Id
    WHERE e.PRO_PrixEuro = tmp.PrixMini
    AND e.PRO_Id = tmp.PRO_Id
    Vous avez une idée ?

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Pour ceux que ca interesse, voila un debut de solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT PRO_Id, PRO_GRO_Id, PRO_PrixEuro, PRO_EstEnPromo
    FROM produits
    WHERE PRO_PrixEuro
    IN (
     
    SELECT MIN( PRO_PrixEuro )
    FROM produits
    GROUP BY PRO_GRO_Id
    )
    GROUP BY PRO_GRO_Id

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    on dirait que j'ai finit par trouver :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT t1.PRO_Id, t1.PRO_PrixEuro
    FROM produits t1
    INNER JOIN (
        SELECT PRO_Id, MIN(PRO_PrixEuro) AS PrixMini
        FROM produits
        GROUP BY PRO_GRO_Id) AS t2
    ON t1.PRO_PrixEuro = t2.PrixMini
    GROUP BY PRO_GRO_Id

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Bravo ! Ca fait plaisir de voir que vous vous êtes creusé la tête !
    Néanmoins vous avez une petite erreur dans votre code au niveau de la jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT t1.PRO_Id, t1.PRO_PrixEuro
    FROM produits t1
    INNER JOIN (
        SELECT PRO_Id, MIN(PRO_PrixEuro) AS PrixMini
        FROM produits
        GROUP BY PRO_GRO_Id) AS t2
       ON t1.PRO_Id = t2.PRO_Id
      AND t1.PRO_PrixEuro = t2.PrixMini
    GROUP BY PRO_GRO_Id

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Effectivement, c'est la toute la subtilité de la requete, mais votre version ne fontionne pas...

    car la sous requete me renvoie bien le prix le plus bas, mais l'Id Produit associé n'est pas forcement celui qui correspond a ce prix le plus bas.

    C'est pour pour cela que je fais ma jointure uniquement sur le prix et non pas sur le prix ET l'Id Produit...

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Vous voulez avoir le prix minimum par catégorie, c'est donc celle-ci qui doit apparaître dans la jointure en plus du prix.
    Le dernier group by est inutile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT t1.PRO_GRO_Id, t1.PRO_Id, t1.PRO_PrixEuro
    FROM produits t1
    INNER JOIN (
        SELECT PRO_GRO_Id, MIN(PRO_PrixEuro) AS PrixMini
        FROM produits
        GROUP BY PRO_GRO_Id) AS t2
       ON t1.PRO_GRO_Id = t2.PRO_GRO_Id AND t1.PRO_PrixEuro = t2.PrixMini
    Vous auriez aussi pu passer par une sous-requête dans le where :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT t1.PRO_GRO_Id, t1.PRO_Id, t1.PRO_PrixEuro
    FROM produits t1
    WHERE t1.PRO_PrixEuro = (select min(t2.PRO_PrixEuro) 
                             FROM produits t2
                             WHERE t1.PRO_GRO_Id = t2.PRO_GRO_Id 
                             GROUP BY t2.PRO_GRO_Id)

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Merci en tous cas pour votre dernier message, il m'aide a comprendre les subtilités des jointures et des sous requetes.

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/06/2012, 16h18
  2. Réponses: 6
    Dernier message: 27/02/2009, 13h14
  3. Fonction produit avec group by
    Par nicoaix dans le forum Requêtes
    Réponses: 5
    Dernier message: 25/09/2008, 17h31
  4. Ajouter un groupe dans un autre groupe
    Par CedrX dans le forum Administration système
    Réponses: 0
    Dernier message: 10/01/2008, 12h20
  5. Equivalent d'un GROUP BY d'un GROUP BY
    Par french-petzouille dans le forum Requêtes
    Réponses: 4
    Dernier message: 23/10/2007, 11h07

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