Comme souvent, l'article du jour part d'une interrogation.
Imaginons que nous disposions d'un ensemble d'articles en base de données.
Pour ne pas alourdir les accès au serveur SQL, les logs de consultation sont stockés dans un fichier texte, par exemple en serializant un array avec clé = ID et valeur=Nombre de vues. Autrement dit, on dispose de deux données a priori indépendantes :

  • Le titre et l'ID en base de données
  • L'ID et le nombre de vues en fichier texte.

Vous voyez venir le problème gros comme une maison : comment connecter ces deux jeux de données pour, par exemple, récupérer les 10 articles les plus vus ?
Une rapide réflexion vous amènera peut-être à considérer la fonction IF imbriquée n fois, mais ce n'est bien évidemment pas viable.

En fait, mySQL fournit deux fonctions pour ce genre de questionnement : FIELD et ELT.

À titre d'exemple, nous allons tenter de récupérer en une seule requête les 10 articles les plus lus (récupération du titre associé au nombre de vues).
On supposera que vous avez un tableau trié que nous nommerons $Best avec les articles les plus lus (Array(ID=>NbVue,...).

La fonction FIELD()

Premier réflexe : consulter la documentation.

FIELD(str,str1,str2,str3,...)

Retourne l'index de la chaîne str dans la liste str1, str2, str3, .... Retourne 0 si str n'est pas trouvé. La fonction FIELD() est un complément de la fonction ELT()

Comment expliquer cela ? En fait, FIELD() est l'équivalent de la fonction PHP array_search.
Un exemple semble s'imposer. Pour ID="pos4", la fonction FIELD(ID,"pos1","pos2","pos3","pos4","pos5") renverra 4. Quel intérêt ? Et bien, nous allons pouvoir trier nos articles par le nombre de vues (ce qui n'est pas un ORDER BY simple sur une unique colonne).

Le code suivant s'impose alors :


Premier objectif réalisé : nous avons bien récupéré les 10 articles les plus lus, triés dans le bon sens. Nous pourrions sauter l'étape suivante en ajoutant via PHP la valeur associée à l'index, mais pourquoi ne pas profiter de la puissance de mySQL pour effectuer cette tâche ?

La fonction ELT()

Un nouveau passage dans la documentation s'impose :

ELT(N,str1,str2,str3,...)

Retourne str1 si N = 1, str2 si N = 2, et ainsi de suite. Retourne NULL si N est plus petit que 1 ou plus grand que le nombre d'arguments. La fonction ELT() est un complément de la fonction FIELD().

Vous l'avez compris, ELT() fait l'inverse de FIELD : pour ID=4, on aura ELT(ID,"pos1","pos2","pos3","pos4","pos5") qui renverra "pos4".
Dans notre cas, nous allons faire en sorte de récupérer le nombre de vues de l'article :


Et voilà, le tour est joué ! Pour chaque élément, on récupère son numéro d'index dans la liste et on le couple avec la valeur associée. En quelques lignes, nous avons réussi à éviter une boucle de requêtes. Un bon résultat, non ?