Bonjour, et merci pour la réponse intéressante. J'ai parcouru le tuto indiqué découvert des trucs intéressants...!
Alors la requête proposée fonctionne bien mais pose 2 problèmes :
- Un joueur ayant réalisé 2 fois le même score apparait 2 fois
- Le temps d'exécution de la requête est TRES long
Pour le temps, j'ai rajouté les index manquants, mais le temps était toujours trop long (environ une seconde, c'est trop de charge pour le serveur). On passe je pense à un parcours de type n² (pour chaque enreg, on lit tous les autres) et je souhaite plutôt un parcours de type n...
Du coup j'ai trouvé un contournement, peut-être pas très orthodoxe mais qui fonctionne bien. Je crée une chaîne qui est la concaténation de mon score et de l'identifiant de la partie (6 caractères pour chaque donnée), et c'est le max de cette chaîne que j'utilise...
select max(right(concat('000000',scorePartie,right(CONCAT('000000',idPartie),6)),12)) from parties
puis je récupère pour chaque ligne du résultat l'idPartie. Ensuite, je constitue une liste de mes idPartie et je fais une seconde requête avec un find_in_set dans lequelle j'indique la liste de mes idPartie :
select * from parties where find_in_set(idPartie,'".$listeId."') order by score desc
Avec cette solution, le temps de réponse est quasi-instantané.
Mais il y a sans doute mieux ou plus élégant pour la même performance.
Le but était d'afficher la page des classements d'un jeu de tables de multiplications pour les enfants !
Le résultat peut être vu là :
http://marlot.org/multiplication/?pg=podium
Nicolas
Partager