@egecorp
FullStack

MySQL как удалить всё данные, кроме данных, попадающих под условие?

Всем доброго дня!

Имеется таблица со ссылками на скриншоты, и время от времени её нужно чистить. Чистить так, чтобы удалять все скриншоты, сделанные раньше метки времени, если они не являются последними для своего компьютера.

Первое, что пришло в голову это
DELETE FROM Screenshots 
WHERE (tSTAMP < NOW() - INTERVAL ? SECOND)
   AND 
    (tSTAMP NOT IN 
       (SELECT MAX(tSTAMP) 
        FROM Screenshots 
        GROUP BY GUID) 
    )

где tSTAMP - метка времени, GUID - идентификатор компьютера
Но понятно, что возникает ошибка
You can't specify target table 'Screenshots' for update in FROM clause
.

Прошу подсказать, как лучше сделать такое удаление.
  • Вопрос задан
  • 141 просмотр
Решения вопроса 1
Immortal_pony
@Immortal_pony Куратор тега MySQL
Во-первых, более корректно работать со смещением по датам с помощью функций DATE_SUB/DATE_ADD
Во-вторых, MySQL не позволяет изменять данные, используя для этого выборку из той же таблицы. Это ограничение можно обойти, если использовать выборку из этой выборки.

DELETE FROM Screenshots 
WHERE 1
AND tSTAMP < DATE_SUB(NOW(), INTERVAL ? SECOND)
AND (
	tSTAMP NOT IN (
		SELECT `subquery`.`last_timestamp` FROM (
			SELECT MAX(tSTAMP) AS 'last_timestamp'
			FROM Screenshots 
			GROUP BY GUID
		) AS `subquery`
	) 
)


PS Если будет более одного снимка экрана для одного guid с одинаковой меткой времени, то не удалятся оба.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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