MySQL : Multiples tris et sous-requêtes

Publié le

Un petit truc en MySQL qui j'en suis sûr servira à plus d'un.

Pour California Apparel News, cela fait plusieurs fois que j'utilise cette technique qui marche à merveille.

Le problème est le suivant : Comment récupérer les 10 derniers ajouts d'une table mais triés par ordre alphabétique ?

La solution qui vient tout de suite à l'esprit est :

SELECT * FROM table ORDER BY date DESC, titre ASC LIMIT 0,10

On récupère bien les 10 derniers résultats, mais ils ne sont en aucun cas triés par ordre alphabétique. En effet, le tri se fait d'abord sur la date dans l'ordre décroissant, puis sur le titre. Le tri sur le titre ne sera effectif que si on a des éléments à la même date. Un exemple de ce qui pourrait sortir de cette requête est :

(Bon que 4 résultats, je ne me souviens pas d'autres choses niveau météo ici)

On a les bons résultats, mais pas triés correctement. Alors c'est sûr, on pourrait écrire une fonction PHP pour trier les résultats et c'est bouclé. Mais une fonction de tri n'est jamais évidente à écrire et trier dès la requête augmentera les performances.

La solution est d'utiliser une sous-requête dans la clause FORM; la sous-requête récupèrera les 10 derniers résultats, la requête principal les triera par ordre alphabétique. La requête complète :

SELECT * FROM (SELECT * FROM table ORDER BY date DESC LIMIT 0,10) AS subSelect ORDER BY titre ASC

Noter le AS subSelect qui est indispensable, comme indiquée dans la doc.

Le résultat sera :

La différence entre les 2 résultats est minime, mais vous avez compris !

Nous voilà donc avec nos résultats tout bien trié comme on le voulait !

J'ai utilisé ça à 2 endroits :

En espérant que vous aurez l'occasion d'utiliser cette petite technique qui gagne du temps.