SQL : SELECT ORDER BY avec une liste d'IDs dans un ordre défini

Voici comment faire un SELECT sur une table en classant le résultat en fonction d'un ordre d'IDs prédéfinis.
A quoi ça sert, me direz-vous ?

Imaginez une table product_category avec les enregistrements suivants:


Vous pourriez vous contenter de récupérer les catégories pour les mettre dans votre menu en les classant par ordre alphabétique, ou par ordre des IDs.
Mais pour des raisons obscures, votre expert SEO vous a demandé de faire afficher les catégories dans un ordre particulier car cela permettrait d'améliorer l'expérience utilisateur et probablement de booster les ventes.

Il a certainement une bonne raison pour faire cela, qu'à cela ne tienne.

Mais comment faire un SELECT pour avoir un résultat trié dans l'ordre demandé ?

PostgreSQL:

Nous allons faire un JOIN sur une liste de VALUES sous la forme (id, index) comme ci-dessous :

MySQL :

Nous allons utiliser la clause ORDER BY FIELD()

Ici, vous l'avez compris, on va récupérer en premier la catégorie qui a le category_id = 3, puis celle qui a le category_id = 1, puis 4, puis 2 et finalement celle qui a le category_id = 5.

Dans le premier cas (postgreSQL), il n'y a pas d'autre moyen que de définir les valeurs (id, index) directement dans le code. C'est un des inconvénients de cette méthode. Un autre inconvénient est qu'il faudra penser à compléter la liste de valeurs dans le JOIN en cas d'ajout ou de suppression de catégorie.

Si vous voulez changer l'ordre des catégories, vous devrez alors réécrire les paires de valeurs (id, index) pour afficher les catégories dans le nouvel ordre.

Dans le deuxième cas (MySQL) il est possible de trier un tableau de category_id dans l'ordre souhaité et d'écrire

Vous allez me dire, on aurait plus directement écrire les noms des catégories dans le menu (en HTML).

Oui, mais l'exemple ci-dessus ne récupère que l'id et le nom de la catégorie, mais n'oubliez pas que vous récupèrerez sûrement d'autres champs tels que : image, description, description_short, tags, le tout probablement en utilisant des jointures sur d'autres tables.