|
Publicité | ||||||||||||||||||||||
|
|
#1 |
|
Membre extrêmement actif(ve)
![]() Inscription: juin 2006
Messages: 1 699
|
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 :
SELECT fruit, CASE WHEN recette = "saison" THEN recette ELSE recette END AS recette FROM ma_table GROUP BY fruit 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. |
|
|
00
|
|
|
#2 |
![]() Nom : Antoine Dinimant
Inscription: octobre 2006
Localisation: Paris
Âge: 40
Messages: 5 588
|
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 |
|
|
00
|
|
|
#3 |
|
Membre extrêmement actif(ve)
![]() Inscription: juin 2006
Messages: 1 699
|
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. |
|
|
00
|
|
|
#4 |
|
Membre extrêmement actif(ve)
![]() Inscription: juin 2006
Messages: 1 699
|
Il faut peut-être ne pas utiliser le GROUP BY et faire comme ceci
Code :
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. |
|
|
00
|
|
|
#5 |
![]() |
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. « 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 ! Soutenons l'industrie logicielle française ! |
|
|
00
|
|
|
#6 |
|
Membre extrêmement actif(ve)
![]() Inscription: juin 2006
Messages: 1 699
|
Table
Code :
-- -- 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. ');
__________________
Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose. |
|
|
00
|
|
|
#7 | |
![]() |
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:
On cherche donc quelle est la "plus grande" recette : Code :
SELECT fruit, MAX(recette) AS recette FROM test_recettes GROUP BY fruit Code :
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. « 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 ! Soutenons l'industrie logicielle française ! |
|
|
|
00
|
|
|
#8 |
|
Membre extrêmement actif(ve)
![]() Inscription: juin 2006
Messages: 1 699
|
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. |
|
|
00
|
|
|
#9 |
![]() |
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. « 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 ! Soutenons l'industrie logicielle française ! |
|
|
00
|