Enkin
@Enkin
менеджер инет-проектов

Как хранить в MySQL периодические данные?

Есть таблица с рейтингами, которые обновляются раз в месяц. Выглядит так:

Август:
--------------
| Иван | 8 |
| Петр | 4 |
| Дима | 5 |

Сентябрь (важно: добавился новый участник):
--------------
| Иван | 8 |
| КОЛЯ | 2 |
| Дима | 5 |

Как лучше организовать структуру хранения таких ежемесячных таблиц, чтобы выводить оттуда графики вида "Динамика рейтинга Ивана по месяцам", "Топ-3 максимального прироста рейтинга" и другие?

Стек - YII2 (php+mysql)
  • Вопрос задан
  • 179 просмотров
Пригласить эксперта
Ответы на вопрос 3
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Всегда вести консолидирующие таблицы:
Рейтинг юзеров за последние сутки, за последние 7 дней, за последние 14, за месяц, за два, за три, за 6, за 12 и по месяцам: янв, февр,...,дек, годам.

На произвольные даты - суммировать центральные готовые данные и делать "довески" спереди и сзади через выборку за период менее недели (по одному или нескольким юзерам).
Ответ написан
@kuftachev
Таблица member и таблица ranking: id, result, month (от задачи нужно понимать как нумеровать, хоть просто число и знать, что 1 - это 7.2015, можно строкой, в одни, от ситуации), member_id.

Первый запрос вообще элементарный. Второй на SQL хз как, но выбрать за последние три месяца и отсортировать на уровне приложения. Если сильно хорошо подумать, там с несколькими вложенными select может к чему-то прийти и можно, но тут конечно нужно понимать задачу, нагрузку и прочее. Так как можно написать полноценную функцию на SQL, но это уже больше работа для DBA.
Ответ написан
Комментировать
serginhold
@serginhold
Если точно известно разделение строго по месяцам, в чем проблема то?

Допустим есть таблица с текущем рейтингом пользователей
| id | rating |

Есть лог таблица для рейтинга
| user_id | месяц/год | rating |

Делаешь триггер, при обновлении первой таблицы обновлять вторую для текущего года/месяца

Ну и всё,
запросы которые ты хочешь делать вроде простые получаются,
первый просто выборка по юзеру,
второй: join таблицы на саму себя для второй даты с ON по юзеру , и сортировка по разнице между двумя рейтингами, + limit
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы