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

MySQL Discussion :

Sélection du résultat lors d'un group by


Sujet :

MySQL

  1. #1
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut Sélection du résultat lors d'un group by
    Bonsoir,

    Lorsque l'on fait un GROUP BY, est-il possible de choisir les valeurs que l'on veut garder dans le SELECT.

    Exemple : J'ai des recettes de base pour faire des confitures et ensuite j'ai des variantes. Je veux la liste des recettes et dans cette liste une seule recette par fruit sachant que la recette de saison l'emporte sur la recette de base.

    Ma requete ressemblerait à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT fruit, CASE WHEN recette = "saison" THEN recette ELSE recette END AS recette 
    FROM ma_table
    GROUP BY fruit
    Donc je veux avoir la recette de saison du fruit lorsqu'elle existe et celle de base sinon.

    Merci pour votre éclairage
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    je ne comprends ton THEN recette ELSE recette... si dans tous les cas tu veux la même chose ce n'est pas la peine de faire un CASE
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Oui mais alors comment lui dire que je veux dans le group by la recette de la saison si elle existe. La recette de base étant celle par défaut.
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

  4. #4
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Il faut peut-être ne pas utiliser le GROUP BY et faire comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT recette
    FROM ma_table
    WHERE recette NOT IN(
    SELECT recette
    FROM ma_table
    WHERE recette = "saison")
    AND recette = "base"
    UNION
    SELECT recette
    FROM ma_table
    WHERE recette = "saison"
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

  5. #5
    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 : 60
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    On peut avoir la structure de la table et un exemple de données ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Table
    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
    20
    21
    22
    --
    -- Structure de la table `test_recettes`
    --
     
    CREATE TABLE IF NOT EXISTS `test_recettes` (
      `id_recette` int(3) NOT NULL auto_increment,
      `fruit` varchar(15) NOT NULL,
      `recette` varchar(15) NOT NULL,
      `explication` text NOT NULL,
      PRIMARY KEY  (`id_recette`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;
     
    --
    -- Contenu de la table `test_recettes`
    --
     
    INSERT INTO `test_recettes` (`id_recette`, `fruit`, `recette`, `explication`) VALUES
    (1, 'pommes', 'base', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla non nisi nisl, vel condimentum eros. Suspendisse tempus venenatis iaculis. Duis congue placerat rutrum. Nunc et leo justo. In hac habitasse platea dictumst. Maecenas sit amet hendrerit sem. Vestibulum eget risus ut nibh iaculis tincidunt id tincidunt arcu. Sed eget elit sapien, a vulputate nibh. Fusce sollicitudin pulvinar sapien ut auctor. Proin molestie fringilla lorem nec pretium. In molestie imperdiet aliquet. Maecenas hendrerit massa a urna vulputate tincidunt. Morbi venenatis nulla quis nunc feugiat eget congue dui imperdiet. Etiam tristique, turpis gravida semper porttitor, lectus dolor aliquet dolor, tincidunt mattis diam justo et metus. Duis rutrum ante id nunc accumsan porttitor. Donec eros velit, molestie eget interdum eget, porta quis massa. Proin non aliquam lorem. '),
    (2, 'pommes', 'printemps', 'Pellentesque ut tellus ut elit malesuada aliquet quis a ante. Morbi pulvinar nibh in mauris aliquet hendrerit. Morbi suscipit gravida erat vitae tempor. Integer posuere luctus justo sit amet auctor. Donec justo nisi, vestibulum sed volutpat vel, consectetur nec est. Nulla pretium massa sit amet quam blandit eget placerat lacus venenatis. In feugiat metus id sem porttitor eu luctus nisl aliquet. Cras nec nibh ipsum. Nam enim lorem, malesuada sed ullamcorper nec, interdum et magna. Integer ante purus, luctus at luctus tempus, auctor ut nisi. Sed ullamcorper suscipit vulputate. Sed sed volutpat lacus. Maecenas eu quam ac purus porttitor sodales quis ut nisi. Nunc semper ante ut orci molestie sagittis. '),
    (3, 'poires', 'base', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla non nisi nisl, vel condimentum eros. Suspendisse tempus venenatis iaculis. Duis congue placerat rutrum. Nunc et leo justo. In hac habitasse platea dictumst. Maecenas sit amet hendrerit sem. Vestibulum eget risus ut nibh iaculis tincidunt id tincidunt arcu. Sed eget elit sapien, a vulputate nibh. Fusce sollicitudin pulvinar sapien ut auctor. Proin molestie fringilla lorem nec pretium. In molestie imperdiet aliquet. Maecenas hendrerit massa a urna vulputate tincidunt. Morbi venenatis nulla quis nunc feugiat eget congue dui imperdiet. Etiam tristique, turpis gravida semper porttitor, lectus dolor aliquet dolor, tincidunt mattis diam justo et metus. Duis rutrum ante id nunc accumsan porttitor. Donec eros velit, molestie eget interdum eget, porta quis massa. Proin non aliquam lorem. '),
    (4, 'poires', 'printemps', 'Pellentesque ut tellus ut elit malesuada aliquet quis a ante. Morbi pulvinar nibh in mauris aliquet hendrerit. Morbi suscipit gravida erat vitae tempor. Integer posuere luctus justo sit amet auctor. Donec justo nisi, vestibulum sed volutpat vel, consectetur nec est. Nulla pretium massa sit amet quam blandit eget placerat lacus venenatis. In feugiat metus id sem porttitor eu luctus nisl aliquet. Cras nec nibh ipsum. Nam enim lorem, malesuada sed ullamcorper nec, interdum et magna. Integer ante purus, luctus at luctus tempus, auctor ut nisi. Sed ullamcorper suscipit vulputate. Sed sed volutpat lacus. Maecenas eu quam ac purus porttitor sodales quis ut nisi. Nunc semper ante ut orci molestie sagittis. '),
    (5, 'bananes', 'base', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla non nisi nisl, vel condimentum eros. Suspendisse tempus venenatis iaculis. Duis congue placerat rutrum. Nunc et leo justo. In hac habitasse platea dictumst. Maecenas sit amet hendrerit sem. Vestibulum eget risus ut nibh iaculis tincidunt id tincidunt arcu. Sed eget elit sapien, a vulputate nibh. Fusce sollicitudin pulvinar sapien ut auctor. Proin molestie fringilla lorem nec pretium. In molestie imperdiet aliquet. Maecenas hendrerit massa a urna vulputate tincidunt. Morbi venenatis nulla quis nunc feugiat eget congue dui imperdiet. Etiam tristique, turpis gravida semper porttitor, lectus dolor aliquet dolor, tincidunt mattis diam justo et metus. Duis rutrum ante id nunc accumsan porttitor. Donec eros velit, molestie eget interdum eget, porta quis massa. Proin non aliquam lorem. ');
    Je veux extraire pour chaque fruit 1 seule recette qui doit être celle du printemps si elle existe, sinon celle de base.
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

  7. #7
    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 : 60
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Un petit mot sur la modélisation des données.
    Vous devriez avoir une table des fruits et une tables des types de recettes, selon ce modèle :
    type_recette -0,n----typer----1,1- recette -1,1----contenir----0,n- fruit

    Ce qui donnerait les tables :
    type_recette (tr_id, tr_libelle)
    fruit (f_id, f_nom)
    recette (r_id, r_id_type_recette, r_id_fruit, r_explication)

    Revenons à votre besoin :
    Je veux extraire pour chaque fruit 1 seule recette qui doit être celle du printemps si elle existe, sinon celle de base.
    Alphabétiquement, Printemps vient après Base donc 'Printemps' > 'Base'.

    On cherche donc quelle est la "plus grande" recette :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT fruit, MAX(recette) AS recette
    FROM test_recettes
    GROUP BY fruit
    Il ne reste plus qu'à extraire l'explication correspondant à cette recette :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT tr.fruit, tr.recette, tr.explication
    FROM test_recettes AS tr
    INNER JOIN (
      SELECT fruit, MAX(recette) AS recette
      FROM test_recettes
      GROUP BY fruit
    ) AS tmp
      ON tmp.fruit = tr.fruit
        AND tmp.recette = tr.recette
    ORDER BY tr.fruit
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  8. #8
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Pour la modélisation merci, mais j'ai fait un exemple simple parce que la réalité est plus complexe et tourne autour de 7 tables et que ce n'est pas le sujet du moment.

    En dehors du fait que dans mon exemple effectivement "base" est alphabétiquement avant "printemps", la réalité est tout autre, mais j'ai compris le principe qui est celui que j'avais mis plus haut.

    Donc pas de possibilité avec un GROUP BY.

    Merci pour cette confirmation.
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

  9. #9
    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 : 60
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par lodan Voir le message
    Donc pas de possibilité avec un GROUP BY.
    Si !
    Le GROUP BY est utilisé dans la sous-requête qui va déterminer quelle est la recette à extraire.
    Je me doutais que ça pouvait être plus complexe. Notamment, si l'ordre alphabétique ne suffit pas, il faut commencer par donner une valeur ordinale aux différents types de recettes. Dès lors, il suffit d'extraire, comme dans ma requête, le MAX (ou le MIN) de cette colonne artificielle d'ordonnancement des données.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. Réponses: 1
    Dernier message: 20/07/2010, 23h34
  2. Réponses: 2
    Dernier message: 08/07/2010, 15h50
  3. Sélection de résultats identiques
    Par daajack dans le forum Débuter
    Réponses: 4
    Dernier message: 19/03/2008, 09h01
  4. Sélection du premier enregistrement de chaque groupe
    Par mout1234 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 15/05/2007, 16h27
  5. fonction: renvoyer résultat d'un count .. group by ?
    Par ctobini dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 26/09/2006, 14h21

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