Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как составить sql-запрос на удаление всех объявлений таблицы за исключением 30 последних?
 
 автор: antf   (14.07.2014 в 11:57)   письмо автору
 
 

Здравствуйте.
Как составить sql-запрос на удаление всех объявлений таблицы за исключением 30 последних?

  Ответить  
 
 автор: cheops   (14.07.2014 в 12:04)   письмо автору
 
   для: antf   (14.07.2014 в 11:57)
 

Возможно заинтересует 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

  Ответить  
 
 автор: Eugene77   (14.07.2014 в 12:22)   письмо автору
 
   для: cheops   (14.07.2014 в 12:04)
 

Это будет работать если id и updated_at имеют тот же порядок?
Возможно правильнее будет:
DELETE
  posts
FROM
  posts
JOIN
 (SELECT
    id
  FROM
    posts
  ORDER BY
    updated_at DESC
  LIMIT 5, 1) AS delpst
ON
  posts.updated_at<= delpst.updated_at

  Ответить  
 
 автор: antf   (15.07.2014 в 03:17)   письмо автору
 
   для: cheops   (14.07.2014 в 12:04)
 

Вроде дело обычное, бытовое, а тут такая задачка! Спасибо.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования