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