J'ai une table MySQL très simple où j'enregistre les meilleurs scores. Cela ressemble à ça:
Id Name Score
Jusqu'ici tout va bien. La question est: comment obtenir le classement d'un utilisateur? Par exemple, j'ai un utilisateur Name
ou Id
et je veux obtenir son rang, où toutes les lignes sont ordonnées en ordre décroissant pour le Score
.
Un exemple
Id Name Score
1 Ida 100
2 Boo 58
3 Lala 88
4 Bash 102
5 Assem 99
Dans ce cas précis, Assem
le rang de 'serait 3, car il a obtenu le 3e score le plus élevé.
La requête doit renvoyer une ligne, qui contient (uniquement) le rang requis.
(SELECT GROUP_CONCAT(score) FROM TheWholeTable)
n'est pas la meilleure façon. Et cela peut avoir un problème avec la taille de la ligne créée.SELECT 1 + COUNT(*) AS rank FROM scores WHERE score > (SELECT score FROM scores WHERE name='Assem')
. Lequel "juste" compte le nombre d'entrées avec un score plus élevé que l'entrée actuelle. (Si vous ajoutez,DISTINCT
vous obtiendrez le classement sans lacunes ..)Lorsque plusieurs entrées ont le même score, le rang suivant ne doit pas être consécutif. Le rang suivant doit être incrémenté du nombre de scores partageant le même rang.
Pour afficher des scores comme celui-ci, il faut deux variables de classement
Voici une version plus stable du classement avec égalité:
Essayons cela avec des exemples de données. Voici d'abord les exemples de données:
Chargeons les exemples de données
Ensuite, laissez initialiser les variables utilisateur:
Maintenant, voici la sortie de la requête:
Veuillez noter que plusieurs identifiants qui partagent le même score ont le même rang. Notez également que le classement n'est pas consécutif.
Essaie !!!
la source
la source
Une option serait d'utiliser des variables USER:
la source
La réponse acceptée a un problème potentiel. S'il y a deux scores identiques ou plus, il y aura des lacunes dans le classement. Dans cet exemple modifié:
Le score de 58 a le rang 5, et il n'y a pas de rang 4.
Si vous voulez vous assurer qu'il n'y a pas de lacunes dans les classements, utilisez-
DISTINCT
leGROUP_CONCAT
pour construire une liste de scores distincts:Résultat:
Cela fonctionne également pour obtenir le rang d'un seul utilisateur:
Résultat:
la source
COUNT
et d'une sous-requête à la place. Voir mon commentaire à la réponse acceptéeVoici la meilleure réponse:
Cette requête renverra:
3
la source
Cette solution donne
DENSE_RANK
en cas d'égalité:la source
Le travail suivant ne fonctionnerait-il pas (en supposant que votre table s'appelle Scores)?
la source
J'ai ceci, qui donne les mêmes résultats que celui avec des variables. Cela fonctionne avec des liens et cela peut être plus rapide:
Je ne l'ai pas testé, mais j'en utilise un qui fonctionne parfaitement, que j'ai adapté à cela avec les variables que vous utilisiez ici.
la source