Dans un projet de commerce électronique, j’avais la tache d’ordonner des produits selon leur nom, une fonction courante et généralement simple. Par contre, dans ce cas, les noms finissaient par des chiffres, et comme la plupart des fonctions en informatique, ceux-ci étaient ordonnés de la façon suivante:
Produit #1 Produit #11 Produit #12 Produit #2 Produit #3 (...)
Ce qui est logique en informatique si on évalue leur valeur littérale pour une liste alphabétique, mais les êtres humains préfèrent évidemment une liste qui considère la valeur numérique de l’identifiant, non sa valeur littérale, ou, par exemple, 11 est plus grand que 2, comme suit:
Produit #1 Produit #2 Produit #3 (...) Produit #11 Produit #12
Comment faire en PHP et MySQL? L’idée générale est d’isoler la partie chiffrée du nom et de la considérer comme un nombre. Voici l’expression MySQL initiale:
$query = "SELECT * FROM table ORDER BY ProduitNom ASC";
Et voici l’expression MySQL qui évalue plutôt le nombre après le symbole #
:
$query = "SELECT * FROM table ORDER BY SUBSTRING_INDEX(ProduitNom . ", \"#\", -1) + 0 ASC";
La fonction MySQL SUBSTRING_INDEX
nous permets d’extraire le nombre après le symbole #
(le numéro négatif qui suit, -1
, détermine dans ce cas la direction à prendre dans le morceau de texte) et la partie + 0
(un petit truc légèrement ésotérique) force MYSQL à considérer la valeur numérique du nombre, et non sa valeur littérale.