| Возможно заинтересует SQL-задачка, которую я как-то составлял некоторое время назад
Следует удалить из таблицы post устаревшие записи,
таким образом, чтобы остались последние 5 записей
(по полю updated_at)
Хорошо бы задачу решить при помощи одного запроса
(многотабличный вариант DELETE с самообъединением).
Предполагается, что количество записей в таблице
произвольное, поэтому следующий запрос использовать
не допускается
DELETE FROM
posts
ORDER BY
updated_at
LIMIT 15
|
Дамп базы данных
CREATE TABLE IF NOT EXISTS posts (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(255) NOT NULL,
updated_at date NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO posts VALUES
(1, 'первая запись', '2012-11-01'),
(2, 'вторая запись', '2012-11-02'),
(3, 'третья запись', '2012-11-03'),
(4, 'четвертая запись', '2012-11-04'),
(5, 'пятая запись', '2012-11-05'),
(6, 'шестая запись', '2012-11-06'),
(7, 'седьмая запись', '2012-11-07'),
(8, 'восьмая запись', '2012-11-08'),
(9, 'девятая запись', '2012-11-09'),
(10, 'десятая запись', '2012-11-10'),
(11, 'одинадцатая запись', '2012-11-11'),
(12, 'двенадцатая запись', '2012-11-12'),
(13, 'тринадцатая запись', '2012-11-13'),
(14, 'четырнадцатая запись', '2012-11-14'),
(15, 'пятнадцатая запись', '2012-11-15'),
(16, 'шестнадцатая запись', '2012-11-16'),
(17, 'семнадцатая запись', '2012-11-17'),
(18, 'восьмнадцатая запись', '2012-11-18'),
(19, 'девятнадцатая запись', '2012-11-19'),
(20, 'двадцатая запись', '2012-11-20');
|
Ответ
DELETE
posts
FROM
posts
JOIN
(SELECT
id
FROM
posts
ORDER BY
updated_at DESC
LIMIT 5, 1) AS delpst
ON
posts.id <= delpst.id
|
| |