|
Publicité ' | ||||||||||||||||||||||
|
|
#1 | ||||||
![]() ![]() ![]() Cédric DuprezInscription : avril 2002 Messages : 4 059 ![]() |
Bonjour,
Je vous propose un nouvel élément à utiliser : Obtenir les n premiers éléments de chaque catégorie Supposons qu'une table ELEMENT et une table CATEGORIE sont composées comme suit : Code :
Code :
Pour obtenir les n derniers éléments de chaque catégorie, il suffit d'inverser le sens de l'inégalité dans la sous-requête : Code :
Qu'en pensez-vous ?
__________________
Rédacteur / Modérateur SGBD Mes tutoriels et la FAQ MySQL ---------------------------------------------------- Pensez aux balises code et au tag Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
|
||||||
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() ![]() Inscription : janvier 2006 Messages : 1 626 ![]() |
ça à l'air sympa. ya l'équivalent d'une base scott/tiger pour mysql? je veux dire la même chose avec des données.
point de vue calculs, c'est gourmand?
__________________
PHP fait nativement la validation d'adresse électronique Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois. Soyez moderne: mysqli_connect() or throw Exception(mysqli_connect_error()); PHP: un problème ? décrivez le avec ceci. Utilisez le bouton résolu! |
|
|
00
|
|
|
#3 |
|
Membre Expert
![]() Pacman PacmanBusiness analyst Inscription : juin 2004 Messages : 1 424 ![]() |
Salut !
Je trouve ça juste un peu dommage que l'exemple donne un tri sur une PK technique Genre j'aurais bien vu par exemple une date de création à la place, et combiner l'ordre date_creation + increment (pour départager les ex-aequos et garantir qu'on en sorte au plus n)
__________________
(c'est ma photo) Paku, Paku ! Pour les jeunes incultes : non, je ne suis pas un pokémon... Le pacblog : http://pacmann.over-blog.com/ |
|
00
|
|
|
#4 | ||
![]() ![]() |
Je me suis posé la même question tout récemment car j'ai eu à sortir un top 5 selon deux critères, l'un classé en ASC et l'autre en DESC.
Comme il n'y a pas beaucoup de catégories, je suis passé par des requêtes UNION et LIMIT 5. Un truc du genre : Code :
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. 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 la suite Linux Mageïa ! |
||
|
00
|
|
|
#5 | ||
|
Membre Expert
![]() Pacman PacmanBusiness analyst Inscription : juin 2004 Messages : 1 424 ![]() |
Quand tu as deux (ou plus) critères, il faut réaliser les combinaisons en priorisant.
Dans ton cas, la condition du count(*) de ced serait un truc du genre : Code :
__________________
(c'est ma photo) Paku, Paku ! Pour les jeunes incultes : non, je ne suis pas un pokémon... Le pacblog : http://pacmann.over-blog.com/ |
||
|
00
|
|
|
#6 | ||
|
Membre émérite
![]() ![]() Inscription : juillet 2006 Messages : 1 331 ![]() |
Ça ressemble (en même temps il n'y a pas des milliers de possibilité en MySQL) à un query que j'ai écrit récemment.
Il y a une subtilité supplémentaire dans mon query, c'est une optimisation prenant tout son sens lorsque des critères de recherche impliquent des jointures. En effet, si des lignes doivent être éliminées du résultats, elles doivent l'être autant dans le sous query qui calcul l'ordre de la ligne (dépendante d'un tri) que dans le query principal. Pour ne pas répéter deux fois des jointures qui ne serviraient qu'au filtrage, je procède donc ainsi : Code :
%2$d = Le nombre maximale de lignes à obtenir par "groupe" L'idée c'est d'obtenir dans le sous query une formule qui puisse m'inidquer deux choses : 1) l'ordre de la ligne 2) si la ligne convient au filtre Le sous query renverra 0 si la ligne ne convient pas au filtre et l'ordre de la ligne sinon. |
||
|
|
00
|
|
|
#7 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 12 074 ![]() |
Elle n'est valable QUE dans le cas ou vous utilisez une clef primaire comme comparaison d’inégalité. Si vous utilisez une colonne quelconque, cela peut conduire à des résultats faux.
Dans ce ac, seule la fonction ROW_NUMBER() ou RANK(), implémentée dans tous les SGBDR sauf MySQL sera la seule solution. A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#8 |
|
Membre émérite
![]() ![]() Inscription : juillet 2006 Messages : 1 331 ![]() |
En MySQL, vous pouvez définir une variable entière à 0 et renvoyé sa valeur tout en l'incrémentant dans un select ordonné (order by...).
Je ne me souviens pas de la syntax exact mais c'est une chose à connaître dans ces cas là. Note : Quel déterrement !
__________________
Où est votre sens de l'humour ? |
|
|
00
|
|
|
#9 | ||
|
Membre Expert
![]() ![]() |
Salut
Un exemple avec variable initialisée à zéro Code :
__________________
Le monde est trop bien programmé pour être l’œuvre du hasard… |
||
|
00
|
Copyright © 2000-2013 - www.developpez.com