- 0
Изменение позиции в рейтинге - как реализовать?
(PHP + MySQL)
Есть: рейтинг игроков двух типов - по кол-ву награбленного и по кол-ву побед. Его можно фильтровать - по фракции (обе, 1-ая, 2-ая), по уровню (все, 1-ый, 2-ой, ...) и по периоду (все время, за сегодня, за неделю, за месяц). Чтобы было понятнее, посмотреть можно тут - http://www.moswar.ru/rating/
Надо: отображать изменение позиции в рейтинге. То есть стрелочки вверх-вниз и на сколько мест упал-поднялся.
Ключевые моменты: при изменении фильтра соответственно меняется и позиция. То есть в рейтинге всех уровней я могу быть на 10-ом месте, а в с фильтром по своему уровню - на первом, например (т.е. изменение позиции должны сохраняться для каждого типа фильтра).
Возможное решение: сделать для каждого набора "тип рейтинга + период + фракция + уровень" по полю - последняя позиция. И когда идет обнуление текущего рейтинга (за день, неделю или месяц) в это поле записывать позицию игрока по каждому набору фильтров. А в дальнейшем при выводе от текущего места отнимать то прошлое место. Это и есть соответственно изменение позиции.
Проблема решения: всего наборов всех фильтров будет 2 (типы рейтингов) * 3 (фильтр фракции) * 3 (фильтр периода) * 13 (фильтр уровня) = 234. Сейчас в этом рейтинге 280к игроков (и количество растет). Соответственно это будет все п-ц как долго.
P.S.: в рейтинге по фильтрам выводятся только первые 1000 игроков. Соответственно, можно пожертвовать сохранением позиции остальных игроков (но если сохранять для всех - будет круто).
P.P.S.: изменение рейтинга надо выводить в общем рейтинге, а не по одному. То есть вариант - копировать таблицу перед обнуленим и считать позицию из этой таблицы не подойдет.
1 ответ:
-
- 0
Не надо хранить место в рейтинге, лучше - значения за текущий/предыдущий день, неделю, месяц. При таком количестве фильтров дешевле по времени будет рейтинг считать динамически, а потом страницы кешировать.