Eu tenho uma tabela MySQL muito simples onde eu salvo recordes. Parece assim:
Id Name Score
Até agora tudo bem. A questão é: Como faço para obter o que é uma classificação de usuários? Por exemplo, eu tenho um usuário Name
ou Id
e quero obter sua classificação, onde todas as linhas são ordinais ordenadas de forma decrescente para o Score
.
Um exemplo
Id Name Score
1 Ida 100
2 Boo 58
3 Lala 88
4 Bash 102
5 Assem 99
Neste caso, Assem
a classificação de 's seria 3, porque ele obteve a 3ª maior pontuação.
A consulta deve retornar uma linha, que contém (somente) a Classificação necessária.
dá esta lista:
Obtendo uma pontuação de uma única pessoa:
Dá este resultado:
Você terá uma varredura para obter a lista de pontuação e outra varredura ou procurará fazer algo útil com ela. Um índice na
score
coluna ajudaria o desempenho em tabelas grandes.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 exemplo. Primeiro Aqui estão os dados de exemplo:
Vamos carregar os dados de 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 !!!
Uma opção seria usar variáveis USER:
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ê quiser garantir que não haja lacunas nas classificações, use
DISTINCT
oGROUP_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:
Aqui está a melhor resposta:
Esta consulta retornará:
3
Esta solução dá o
DENSE_RANK
caso de empates:O seguinte não funcionaria (supondo que sua tabela se chama Scores)?
Versão melhorada de @a1ex07, para considerar pontuações duplicadas
Você pode substituir o grupo aninhado select por count(DISTINCT Score) em vez de count(*) para simplificar a consulta, mas o desempenho será drasticamente reduzido
Eu tenho isso, que dá os mesmos resultados que aquele com variáveis. Funciona com gravatas e pode ser mais rápido:
Não testei, mas estou usando um que funciona perfeitamente, que adaptei para isso com as variáveis que você estava usando aqui.