Précédent   Forum des professionnels en informatique > Bases de données > MySQL
MySQL Forum d'entraide MySQL. Avant de poster -> FAQ MySQL, Tutoriels MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 08/03/2010, 18h52   #1
Membre extrêmement actif
 
Avatar de lodan
 
Inscription : juin 2006
Messages : 1 801
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 1 801
Points : 587
Points : 587
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 :
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.
lodan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2010, 23h14   #2
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 832
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 41
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 832
Points : 9 482
Points : 9 482
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 SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2010, 08h32   #3
Membre extrêmement actif
 
Avatar de lodan
 
Inscription : juin 2006
Messages : 1 801
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 1 801
Points : 587
Points : 587
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.
lodan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2010, 10h12   #4
Membre extrêmement actif
 
Avatar de lodan
 
Inscription : juin 2006
Messages : 1 801
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 1 801
Points : 587
Points : 587
Il faut peut-être ne pas utiliser le GROUP BY et faire comme ceci

Code :
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.
lodan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2010, 10h36   #5
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur développement logiciels
Inscription : août 2006
Messages : 10 044
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 044
Points : 16 337
Points : 16 337
Envoyer un message via MSN à CinePhil
On peut avoir la structure de la table et un exemple de données ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2010, 11h59   #6
Membre extrêmement actif
 
Avatar de lodan
 
Inscription : juin 2006
Messages : 1 801
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 1 801
Points : 587
Points : 587
Table
Code :
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.
lodan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2010, 13h23   #7
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur développement logiciels
Inscription : août 2006
Messages : 10 044
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 044
Points : 16 337
Points : 16 337
Envoyer un message via MSN à CinePhil
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 :
Citation:
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 :
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 :
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2010, 13h39   #8
Membre extrêmement actif
 
Avatar de lodan
 
Inscription : juin 2006
Messages : 1 801
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 1 801
Points : 587
Points : 587
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.
lodan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2010, 13h43   #9
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur développement logiciels
Inscription : août 2006
Messages : 10 044
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 044
Points : 16 337
Points : 16 337
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 21h22.


 
 
 
 
Partenaires

Hébergement Web