{par_ordre_liste...} - SPIP
▻https://www.spip.net/fr_article6646.html#par_ordre_liste
le critère de tri SPIP par_ordre_liste
a un gros défaut : si on l’applique sur un ensemble d’éléments qui ne sont pas tous dans la #LISTE
passée en 2ème paramètre, il affiche d’abord les éléments hors de la #LISTE
puis ceux qui sont dedans.
Exemple si on a 16 sites syndiqués dans la BDD :
<BOUCLE_t(SYNDIC){par_ordre_liste id_syndic, #LISTE{14,16,13}}{id_syndic > 10}>
retourne les sites dans l’ordre suivant :
11, 12, 15, 14, 16, 13
La requête SQL passée est :
SELECT * FROM spip_syndic AS syndic
WHERE syndic.id_rubrique > 10
ORDER BY FIELD (syndic.id_syndic, 14,16,13);
Pour obtenir le résultat « naturellement attendu » (i.e. d’abord ceux de la liste puis les autres) il faut utiliser la requête SQL suivante :
SELECT * FROM spip_syndic AS syndic
WHERE syndic.id_rubrique > 10
ORDER BY IF (FIELD(syndic.id_syndic, 14,16,13)=0,1,0), FIELD(syndic.id_syndic,14,16,13);
D’après ▻https://dba.stackexchange.com/questions/109120/how-does-order-by-field-in-mysql-work-internally pour la très astucieuse utilisation du
IF (FIELD ...
en premier critère de la requète