@man_without_face
студент

Как удалить старые записи одного типа, оставив самые свежие?

Есть таблица (текст, дата, пользователь_id)
Как построить delete, чтобы удалить все старые записи пользователя, но оставить одну свежую? Я так понимаю, одним запросом не сделать, нужно сначала сгруппировать по пользователям, затем взять все последнюю запись (по дате), а потом удалить всё что меньше этой даты. Есть идеи получше?
  • Вопрос задан
  • 286 просмотров
Решения вопроса 2
@d-stream
Готовые решения - не подаю, но...
Предлагаю разделить задачу на две:
1. отобрать все записи, которые надо удалить - их идентифицирующие признаки (например primary_key)
2. удалить - уже не составит сложности
Ответ написан
jemunjho
@jemunjho
Если я не ошибаюсь, то MySQL не позволяет удалять данные из той же самой таблицы, из которой делается выборка в подзапросе для выбора данных. Лучше все таки - эту задачу разбить на две:
1) Выбрать всех уникальных user_id и их MAX(date), с группировкой по user_id;
2) Удалить информацию по каждому пользователю через обычный DELETE ... WHERE user_id = ... AND date < выбранной.

Если хотите сделать удаление именно на стороне MySQL - то можно сделать хранимую процедуру, куда передавать user_id и дальше все нужные операции проводить уже в ней.

Но если нужно одним запросом, то можно попробовать обернуть в подзапрос.

delete from test where id in (
select t3.id from (
select
       id
from test AS t1, (
           select
  t.user_id,
  MAX(t.date) AS date
from test as t
group by t.user_id) AS t2 where t1.user_id = t2.user_id AND t1.date < t2.date
) AS t3
);


Но это такое себе решение.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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