#mysql #ranking
#mysql #Рейтинг
Вопрос:
Я разрабатываю своего рода табло. Структура таблицы — это ID, UID, точки, причем UID привязан к учетной записи пользователя.
Теперь у меня это немного работает, но мне нужна одна конкретная вещь, чтобы этот запрос был практически идеальным. Чтобы выбрать пользователя на основе ранга.
Я покажу вам мой SQL.
SELECT *, @rownum := @rownum 1 AS `rank` FROM
(SELECT * FROM `points_table` `p`
ORDER BY `p`.`points` DESC
LIMIT 1)
`user_rank`,
(SELECT @rownum := 0) `r`, `accounts_table` `a`, `points_table` `p`
WHERE `a`.`ID` = `p`.`UID`
Просто заставить его выбирать людей по UID, но это никуда не годится. Мне нужно это, чтобы определить пользователя по его рангу (который является, гм, поддельным полем ^ _ ^’, созданным на лету). Это немного слишком сложно для меня, поскольку моих знаний SQL достаточно для простых запросов, я никогда не углублялся в псевдонимы или вложенные запросы, поэтому вам придется объяснить довольно просто, чтобы я мог понять.
Комментарии:
1. Когда дело доходит до ранжирования чисел, вам лучше использовать переменную PHP в качестве счетчика. <?php в нашем цикле: $i=1; // отобразить строку $ i ;
2. Что, если бы у меня было 10 000 учетных записей? Это было бы огромной нагрузкой на память, пытаясь найти пользователя с 7610-м рейтингом, не так ли?
Ответ №1:
Я думаю, что здесь есть две проблемы. Из того, что я могу собрать, вы хотите выполнить объединение для двух таблиц, упорядочить их по точкам, а затем вернуть n-ю запись. Я собрал НЕПРОВЕРЕННЫЙ запрос. Внутренний запрос выполняет объединение двух таблиц, а внешний запрос указывает, что возвращается только определенная строка.
Этот пример возвращает 4-ю строку.
SELECT * FROM
(SELECT *, @rownum := @rownum 1 AS rank
FROM `points_table` `p`
JOIN `accounts_table` `a` ON a.ID = p.UID,
(SELECT @rownum:=0) r
ORDER BY `p`.`points` DESC) mytable
WHERE rank = 4
Надеюсь, это сработает для вас!
Я внес изменения в ответ, который, как мы надеемся, должен решить эту проблему. Кстати, независимо от того, используете ли вы php или mysql для получения рейтинга, вы все равно сильно нагружаете ресурсы. Прежде чем mysql сможет вычислить ранг, он должен создать таблицу каждого пользователя, а затем упорядочить их. Таким образом, вы просто переносите работу из одной области в другую. По мере увеличения числа пользователей увеличивается и время выполнения запроса, независимо от вашего решения. Вероятно, MySQL потребуется немного больше времени для выполнения вычислений, поэтому PHP, вероятно, является более идеальным решением. Но я также знаю по опыту, что иногда посторонние детали мешают вам получить полностью элегантное решение. Надеюсь, измененный код работает.
Комментарии:
1. ‘Каждая производная таблица должна иметь свой собственный псевдоним’ Это ошибка, которую я получил.