Как удалить все строки из таблицы, кроме новейших 10 строк

У меня есть схема Mysql результата (str) , созданная (timestamp, current on create) и я хотел бы запустить запрос, чтобы удалить все, кроме последних 10, как бы я это сделал?

  DELETE FROM tablename WHERE id NOT IN ( SELECT id FROM tablename ORDER BY created DESC LIMIT 10); 

Вы должны сначала собрать 10 идентификаторов

 CREATE TEMPORARY TABLE ids_to_keep ENGINE=MyISAM SELECT id FROM tablename WHERE 1=2; INSERT INTO ids_to_keep SELECT id FROM tablename ORDER BY created DESC LIMIT 10 ALTER TABLE ids_to_keep ADD PRIMARY KEYS (id); 

Оттуда попробуйте один из этих двух методов:

ТЕХНИКА № 1: УДАЛИТЬ СОЕДИНЕНИЕ

 DELETE A.* FROM tablename A LEFT JOIN ids_to_keep B USING (id) WHERE B.id IS NULL; DROP TABLE ids_to_keep; 

ТЕХНИКА № 2: ОТДЕЛЕНИЕ ТАБЛИЦЫ

 CREATE TABLE tablename_new LIKE tablename; ALTER TABLE tablename RENAME tablename_org; INSERT INTO tablename_new SELECT A.* FROM tablename_org A INNER JOIN ids_to_keep B USING (id); DROP TABLE tablename_org; ALTER TABLE tablename_new RENAME tablename; DROP TABLE ids_to_keep; 

Попробуйте !!!

Вы также можете использовать вариант метода для нахождения N-го максимального значения в таблице, используя самосоединение.

 DELETE FROM tablename WHERE created < ( SELECT created FROM tablename t1 WHERE (N - 1) = (SELECT COUNT( DISTINCT( created ) FROM tablename t1 WHERE t2.created > t1.created ) ) ) 

Внутренняя часть запроса дает вам N-е наибольшее значение «созданного» из вашей таблицы, которое вы можете использовать в качестве ссылки для удаления всего, что было раньше.

Хорошо, это 9 строк, а не 10, но вы получаете идею …

 SELECT * FROM created; +---------------------+ | t | +---------------------+ | 2013-05-28 19:17:03 | | 2013-05-28 19:17:06 | | 2013-05-28 19:17:09 | | 2013-05-28 19:17:11 | | 2013-05-28 19:17:13 | | 2013-05-28 19:17:16 | | 2013-05-28 19:17:17 | | 2013-05-28 19:17:19 | | 2013-05-28 19:17:21 | | 2013-05-28 19:17:23 | | 2013-05-28 19:17:25 | | 2013-05-28 19:17:27 | | 2013-05-28 19:17:29 | | 2013-05-28 19:17:31 | | 2013-05-28 19:17:33 | | 2013-05-28 19:17:35 | | 2013-05-28 19:17:37 | | 2013-05-28 19:17:39 | +---------------------+ 18 rows in set (0.00 sec) DELETE a FROM created a JOIN ( SELECT x.* FROM created x JOIN created y ON yt >= xt GROUP BY xt HAVING COUNT(*) = 10 ) b ON bt >= at; SELECT * FROM created; +---------------------+ | t | +---------------------+ | 2013-05-28 19:17:23 | | 2013-05-28 19:17:25 | | 2013-05-28 19:17:27 | | 2013-05-28 19:17:29 | | 2013-05-28 19:17:31 | | 2013-05-28 19:17:33 | | 2013-05-28 19:17:35 | | 2013-05-28 19:17:37 | | 2013-05-28 19:17:39 | +---------------------+