Eu tenho uma tabela MySQL muito simples, onde eu salvo recordes. Parece que:
Id Name Score
Por enquanto, tudo bem. A pergunta é: como obtenho a classificação dos usuários? Por exemplo, eu tenho um usuário Name
oue Id
deseja obter sua classificação, onde todas as linhas são ordinais ordenadas decrescentes para o Score
.
Um exemplo
Id Name Score
1 Ida 100
2 Boo 58
3 Lala 88
4 Bash 102
5 Assem 99
Nesse mesmo caso, Assem
a classificação seria 3, porque ele obteve a 3ª maior pontuação.
A consulta deve retornar uma linha, que contém (apenas) a classificação necessária.
(SELECT GROUP_CONCAT(score) FROM TheWholeTable)
não é o melhor caminho. E isso pode ter um problema com o tamanho da linha criada.SELECT 1 + COUNT(*) AS rank FROM scores WHERE score > (SELECT score FROM scores WHERE name='Assem')
. Qual 'apenas' conta o número de entradas com uma pontuação mais alta que a entrada atual. (Se você adicionarDISTINCT
, obterá a classificação sem lacunas ..)Quando várias entradas têm a mesma pontuação, a próxima classificação não deve ser consecutiva. A próxima classificação deve ser incrementada pelo número de pontuações que compartilham a mesma classificação.
Para exibir pontuações como essa, são necessárias duas variáveis de classificação
Aqui está uma versão mais estável do ranking com empates:
Vamos tentar isso com dados de amostra. Primeiro, aqui estão os dados de amostra:
Vamos carregar os dados da amostra
Em seguida, vamos inicializar as variáveis do usuário:
Agora, aqui está a saída da consulta:
Observe como vários IDs que compartilham a mesma pontuação têm a mesma classificação. Observe também que a classificação não é consecutiva.
De uma chance !!!
fonte
fonte
Uma opção seria usar variáveis USER:
fonte
A resposta aceita tem um problema em potencial. Se houver duas ou mais pontuações idênticas, haverá lacunas na classificação. Neste exemplo modificado:
A pontuação de 58 tem classificação 5, e não há classificação 4.
Se você deseja garantir que não haja lacunas nas classificações, use
DISTINCT
naGROUP_CONCAT
para criar uma lista de pontuações distintas:Resultado:
Isso também funciona para obter a classificação de um único usuário:
Resultado:
fonte
COUNT
uma subconsulta. Veja meu comentário na Resposta AceitaAqui está a melhor resposta:
Esta consulta retornará:
3
fonte
Esta solução fornece
DENSE_RANK
no caso de empates:fonte
O trabalho a seguir não (assumindo que sua tabela se chama Pontuações)?
fonte
Eu tenho isso, que dá os mesmos resultados que aquele com variáveis. Funciona com laços e pode ser mais rápido:
Não testei, mas estou usando um que funciona perfeitamente, que me adaptei a isso com as variáveis que você estava usando aqui.
fonte