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

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

Вопрос в другом - как лучше присвоить каждому пользователю номер его места? Просто циклом проходить и каждому присваивать его место? Нужно чтобы всем пользователям показывалось их место в топе или хотя бы примерное. Как сделать наиболее эффективно это, если в базе тысячи пользователей? Заранее благодарю за советы!
  • Вопрос задан
  • 196 просмотров
Пригласить эксперта
Ответы на вопрос 2
2ord
@2ord
Можно обойтись без номеров мест.
Завести атрибут score и заносить туда вычисленное вещественное значение рейтинга при каких-то операциях. Например, при написании поста. При выводе списка сортировать по убыванию score.
Ответ написан
grabbee
@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.... не рекомендуется, но вы можете :)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы