У меня есть очень простая таблица MySQL, где я сохраняю рекорды. Это выглядит так:
Id Name Score
Все идет нормально. Вопрос в том, как получить рейтинг пользователя? Например, у меня есть пользователь Name
или, Id
и я хочу получить его ранг, где все строки расположены в порядке убывания Score
.
Пример
Id Name Score
1 Ida 100
2 Boo 58
3 Lala 88
4 Bash 102
5 Assem 99
В этом самом случае Assem
ранг будет 3, потому что он получил 3-е место.
Запрос должен возвращать одну строку, которая содержит (только) требуемый ранг.
(SELECT GROUP_CONCAT(score) FROM TheWholeTable)
не лучший способ. И это может иметь проблемы с размером созданной строки.SELECT 1 + COUNT(*) AS rank FROM scores WHERE score > (SELECT score FROM scores WHERE name='Assem')
. Какой «просто» подсчитывает количество записей с более высоким счетом, чем текущая запись. (Если вы добавите,DISTINCT
вы получите звание без пробелов ..)Когда несколько записей имеют одинаковую оценку, следующий ранг не должен быть последовательным. Следующий ранг должен быть увеличен на количество баллов с одинаковым рангом.
Для отображения таких оценок необходимы две переменные ранга
Вот более стабильная версия рейтинга со связями:
Давайте попробуем это с примерами данных. Сначала вот пример данных:
Давайте загрузим пример данных
Далее, давайте инициализируем пользовательские переменные:
Теперь вот результат запроса:
Обратите внимание, что несколько идентификаторов с одинаковым счетом имеют одинаковый ранг. Также обратите внимание, что рейтинг не является последовательным.
Попробуйте!
источник
источник
Одним из вариантов будет использование переменных USER:
источник
Общепринятый ответ имеет потенциальную проблему. Если есть два или более одинаковых балла, в рейтинге будут пробелы. В этом измененном примере:
Счет 58 имеет 5-е место, а 4-го нет.
Если вы хотите убедиться, что в рейтингах нет пробелов, используйте
DISTINCT
в,GROUP_CONCAT
чтобы создать список отличных результатов:Результат:
Это также работает для получения рейтинга одного пользователя:
Результат:
источник
COUNT
взамен и подзапроса. Смотрите мой комментарий в принятом ответеВот лучший ответ:
Этот запрос вернет:
3
источник
Это решение дает
DENSE_RANK
в случае связей:источник
Не будет ли следующая работа (если ваша таблица называется Scores)?
источник
У меня есть это, которое дает те же результаты, что и с переменными. Он работает со связями и может быть быстрее:
Я не проверял это, но я использую тот, который работает отлично, который я приспособил к этому с переменными, которые вы использовали здесь.
источник