Оценка SQL рейтинга пользователей, с произвольной позиции

Просматривая сайт, большинство вопросов, касающихся рангов в таблице рекордов, предполагает, что вы будете смотреть на всю таблицу или ее верхнюю часть.

Во многих примерах на этом сайте рейтинг определяется путем упорядочения элементов по количеству баллов, а затем путем подсчета строк в верхней части набора или подсчета элементов по мере их извлечения. Как это

score  name     rank
1000   test345  1
999    test980  2
950    test234  3
833    test291  4
760    test573  5
731    test981  6

В моей ситуации мне нужно посмотреть только на часть результатов, которые, возможно, не находятся в верхней части таблицы, например, возможно, наполовину, хотя в таблице лидеров:

scores  name     rank
500     test451  43
433     test768  44
425     test120  45

где пользователь только показывает оценки вокруг его. Часть таблицы лидеров, которую пользователь просматривает выше, находится не в верхней части таблицы лидеров, поэтому я не могу сосчитать строки в возвращенных результатах, чтобы определить их ранг.

Как я могу эффективно определить ранг пользователя в таблице лидеров на произвольной позиции, забавляя там много записей.

Также это мой первый набег в sql и php. Я не могу использовать правильную терминологию.

0

Решение

Я не совсем уверен, что вы пытаетесь сделать. Вы можете ограничить свой результат, используя LIMIT пункт, как это:

SELECT * FROM <table> LIMIT 0, 3

Который вернет только первые 3 записи.

Заказать результат на основе rank поле вы бы использовали ORDER BY пункт:

SELECT * FROM <table> ORDER BY rank DESC LIMIT 0, 3

Приведенный выше запрос вернет 3 записи в порядке убывания.

Если вы хотите рассчитать ранг на основе scores колонка это будет работать:

SELECT scores,
name,
FIND_IN_SET(scores, (SELECT GROUP_CONCAT(scores ORDER BY scores DESC)
FROM <table>)) as rank
FROM <table> ORDER BY rank DESC LIMIT 0, 3;

Выполнение вышеуказанного запроса к таблице с двумя столбцами scores а также name:

+--------+---------+
| scores | name    |
+--------+---------+
|    500 | test451 |
|    433 | test768 |
|    425 | test120 |
|    300 | test001 |
|    250 | test002 |
|    200 | test003 |
+--------+---------+

Даст следующий результат:

+--------+---------+------+
| scores | name    | rank |
+--------+---------+------+
|    500 | test451 |    1 |
|    433 | test768 |    2 |
|    425 | test120 |    3 |
+--------+---------+------+

GROUP_CONCAT() максимальная длина зависит от group_concat_max_len системная переменная, поэтому для большой таблицы это нужно изменить, и я не уверен, что это будет лучшим подходом.

Обратите внимание, что вы можете / должны добавить индексы к вашей таблице, чтобы ускорить процесс:

ALTER <table> ADD INDEX `idx_scores` (`scores`);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]