Tengo una tabla MySQL muy simple donde guardo las mejores puntuaciones. Se ve así:
Id Name Score
Hasta aquí todo bien. La pregunta es: ¿cómo obtengo el rango de usuarios? Por ejemplo, tengo usuarios Name
o Id
y quiero obtener su rango, donde todas las filas están ordenadas ordinales descendiendo para Score
.
Un ejemplo
Id Name Score
1 Ida 100
2 Boo 58
3 Lala 88
4 Bash 102
5 Assem 99
En este mismo caso, Assem
el rango sería 3, porque obtuvo el 3er puntaje más alto.
La consulta debe devolver una fila, que contiene (solo) el Rango requerido.
(SELECT GROUP_CONCAT(score) FROM TheWholeTable)
no es la mejor manera. Y puede tener un problema con el tamaño de la fila creada.SELECT 1 + COUNT(*) AS rank FROM scores WHERE score > (SELECT score FROM scores WHERE name='Assem')
. Que 'solo' cuenta el número de entradas con una puntuación más alta que la entrada actual. (Si agregaDISTINCT
, obtendrá el rango sin huecos ...)Cuando varias entradas tienen el mismo puntaje, el siguiente rango no debe ser consecutivo. El siguiente rango debe incrementarse por el número de puntajes que comparten el mismo rango.
Para mostrar puntajes así se requieren dos variables de rango
Aquí hay una versión más estable de ranking con lazos:
Probemos esto con datos de muestra. Primero, aquí están los datos de muestra:
Carguemos los datos de muestra
A continuación, vamos a inicializar las variables de usuario:
Ahora, aquí está el resultado de la consulta:
Tenga en cuenta que las ID múltiples que comparten el mismo puntaje tienen el mismo rango. También tenga en cuenta que el rango no es consecutivo.
Darle una oportunidad !!!
fuente
fuente
Una opción sería usar variables de USUARIO:
fuente
La respuesta aceptada tiene un problema potencial. Si hay dos o más puntajes idénticos, habrá lagunas en la clasificación. En este ejemplo modificado:
El puntaje de 58 tiene rango 5, y no hay rango 4.
Si desea asegurarse de que no haya espacios en el ranking, el uso
DISTINCT
en elGROUP_CONCAT
de construir una lista de las puntuaciones distintas:Resultado:
Esto también funciona para obtener el rango de un solo usuario:
Resultado:
fuente
COUNT
una subconsulta. Vea mi comentario en la respuesta aceptadaAquí está la mejor respuesta:
Esta consulta devolverá:
3
fuente
Esta solución da
DENSE_RANK
en caso de empate:fuente
¿No funcionaría lo siguiente (suponiendo que su tabla se llame Puntajes)?
fuente
Tengo esto, que da los mismos resultados que el que tiene variables. Funciona con lazos y puede ser más rápido:
No lo probé, pero estoy usando uno que funciona perfectamente, que adapté a esto con las variables que estaba usando aquí.
fuente