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 :
- 11/01/2008 - Il fait beau à Los Angeles
- 09/01/2008 - Nuageux mais pas froid à LA
- 03/01/2008 - Il pleut à Los Angeles
- 03/01/2008 - Tempête sur Los Angeles
(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 :
- 11/01/2008 - Il fait beau à Los Angeles
- 03/01/2008 - Il pleut à Los Angeles
- 09/01/2008 - Nuageux mais pas froid à LA
- 03/01/2008 - Tempête sur Los Angeles
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 :
- Trends pour le menu déroulant
- Fashion Slideshow pour le menu déroulant aussi
En espérant que vous aurez l'occasion d'utiliser cette petite technique qui gagne du temps.