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 ?