Как создать Mysql-запрос на удаление записей с нетривиальным условием?

Начальные условия:
есть 10000 пользователей и их число постоянно растет,
есть 100 онлайн-тренажеров (игры на развитие памяти, внимание и пр.) и их число тоже растет,
есть таблица, куда сохраняются набранные очки, она имеет следующий вид:

id | user_id | game_id | score
таблица имеет составной индекс по полям user_id и game_id

Необходимо:
ограничить бешеный рост этой таблицы. Очевидно, что этого можно добиться, ограничив количество записей набранных очков. То есть, чтобы конкретный пользователь для конкретной игры мог сохранить не более, например, 30 последних результатов + самый первый (чтобы можно было оценить прогресс).

Вопрос:
как составить запрос на удаление всех записей за исключением последних 30 и самой первой (для конкретного пользователя и конкретной игры)? Возможно ли такое вообще? Или придется пересмотреть архитектуру приложения...
  • Вопрос задан
  • 2712 просмотров
Пригласить эксперта
Ответы на вопрос 3
svd71
@svd71
Select * from users  u0 where
Not exists (select * from users u1 where
U1.user_id=u0.user_id order by  id asc limit 1)
Or
Not exists ( select * from users u2 where
U2.user_id=u0.user_id order by id desc 30)


Сначала убеждаешься, что запрос вываливает нужные данные. Потом переписываешь его на delete from.
Ответ написан
При каждом добавлении новой записи такой запрос делать не нужно.

Варианта вижу два:
1. Запускать по расписанию скрипт, удаляющий все лишние записи раз в сутки, например (суть скрипта уже описал @svd71).
2. При добавлении нового результата удалять второй (сортируем, задаем offset). Остается вопрос обработки первых 30 игр. Его можно решить, например, создавая после первой игры еще 29 нулевых значений (на мой взгляд, такое решение удобнее, чем каждый раз проверять, появилась, существует ли уже 30 записей).
Ответ написан
demimurych
@demimurych
А что означает бешеный рост?
Если мне не изменяет память, то практика удаления записей из таблиц считается порочной с точки зрения производительности, и рекомендуется не удалять записи, а обозначать их как удаленные.
Ответ написан
Ваш ответ на вопрос

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

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