Просматривая сайт, большинство вопросов, касающихся рангов в таблице рекордов, предполагает, что вы будете смотреть на всю таблицу или ее верхнюю часть.
Во многих примерах на этом сайте рейтинг определяется путем упорядочения элементов по количеству баллов, а затем путем подсчета строк в верхней части набора или подсчета элементов по мере их извлечения. Как это
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. Я не могу использовать правильную терминологию.
Я не совсем уверен, что вы пытаетесь сделать. Вы можете ограничить свой результат, используя 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`);
Других решений пока нет …