Как лучше организовать просчет места пользователя в рейтинговой таблице?



@KOT10

Здравствуйте, необходимо формировать топ из лучших 100 пользователей, при этом у каждого пользователя будет отображаться его место в топе. Понятно, что рейтинг лучше кешировать, дабы не просчитывать при каждом новом запросе всё заново.

Вопрос в другом — как лучше присвоить каждому пользователю номер его места? Просто циклом проходить и каждому присваивать его место? Нужно чтобы всем пользователям показывалось их место в топе или хотя бы примерное. Как сделать наиболее эффективно это, если в базе тысячи пользователей? Заранее благодарю за советы!


Решения вопроса 0


Ответы на вопрос 2



@2ord

Можно обойтись без номеров мест.
Завести атрибут score и заносить туда вычисленное вещественное значение рейтинга при каких-то операциях. Например, при написании поста. При выводе списка сортировать по убыванию score.



@grabbee

Не вижу проблем. Лучший по некоторому значению «score» — что вы в него запишите, дело ваше. Например количество комментариев в сутки, неделю или месяц. Зависит от самого вашего рейтинга.
1 — Выбрать 100 записей из БД сортировать по score по возрастанию и дате обновления по убыванию
2 — Создать таблицу РЕЙТИНГ один к одному с любыми полями
3 — Добавить выбранные записи в полученном порядке

ID в таблице РЕЙТИНГ AUTO_INCREMENT — в нем будут НОМЕРА МЕСТ от 1 до 100 автоматически. При объединении таблиц в строке пользователя RATING_ID уже будет номер рейтинга. А у остальных NULL
* При обновлении этой таблицы — очистите её со сбросом AUTO_INCREMENT

Вариант #2

После получения 100 записей — Просто циклом обойдите и сделайте UPDATE по полученным ID в таблицу пользователей в её отдельное поле НОМЕР В РЕЙТИНГЕ — туда ставьте значение счетчика цикла

for ($i = 1; $i <= 100; $i++) {
    "UPDATE `users` SET rating_position = ".$i." WHERE ...
}

# или foreach по выборке $i = 1; снаружи и $i++ внутри цикла

это, если в базе тысячи пользователей?

Да хоть сколько, вы же выбирать будете только 100 по значению «score» которое сами и посчитаете заранее

# Запасной вариант

У всех пользователей будет РЕЙТИНГ от 0 до 5 — но плавающий. Например от 0 до 5000000 а для отображения делите на 1000000 — тогда 4832156 станет 4.832156 можете показывать округленно как 4.8 или 5
* Но сортировка топа по значению поля в базе 4832156 и дате обновления
* Тогда сможете выбирать любое количество — топ 3 (5, 10, 100, 1000…) в любой момент
** Хранить дробь в БД типа 4.8321563465464531354655…. не рекомендуется, но вы можете 🙂

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *