Flaker
@Flaker

Как удалить все строки из таблицы, кроме последних N?

Нужно удалить из таблицы все строки кроме последних N штук.

Накидал вот такой запрос:

DELETE FROM `gangs_actions`
WHERE `gangs_actions_id` < (
  SELECT `gangs_actions_id` FROM `gangs_actions` 
  ORDER BY `gangs_actions_id` DESC
  LIMIT 5,1
)


Но он выдает ошибку:
You can't specify target table 'gangs_actions' for update in FROM clause

Как реализовать это правильно?
  • Вопрос задан
  • 10230 просмотров
Решения вопроса 2
@okashirin
оставляет пять последних записей, при условии, что id идут по порядку
DELETE FROM gangs_actions
WHERE gangs_actions_id < (SELECT MAX(gangs_actions_id) - 5 FROM (SELECT * FROM gangs_actions) tmp)


а это твой запрос, только он будет работать
DELETE FROM gangs_actions
WHERE gangs_actions_id <= (
SELECT gangs_actions_id FROM (SELECT * FROM gangs_actions) as tmp
ORDER BY gangs_actions_id DESC
LIMIT 5,1
)
Ответ написан
Snowly
@Snowly
Нужно использовать IN / NOT IN.
Так удалятся все записи из подзапроса.

DELETE FROM `gangs_actions`
WHERE `gangs_actions_id` IN (
  SELECT `gangs_actions_id` FROM `gangs_actions` 
  ORDER BY `gangs_actions_id` DESC
  LIMIT 5
)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
База то какая?
Решение в общем виде - временная таблица. Выберите в неё айдишники объектов которые нужно удалить, и потом напишите условие с выборкой уже из неё, а не из обновляемой таблицы.

По синтаксису или сами смотрите, или пишите название БД, подскажу.
Ответ написан
@Leony
Эти ответы годятся только если есть PK-поле с цифрами.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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