2013-05-28 4 views

ответ

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

Есть в любом случае сделать это с присоединиться? Говорит, что версия mysql не поддерживает ограничение в «in» – user2372936

+0

Существует способ сделать это, используя самостоятельное привязку к левому соединению ... Я просто не уверен в синтаксисе на данный момент. – Orangepill

+0

Этот стиль 'DELETE' довольно опасен по двум причинам: Reason1) Оптимизатор запросов имеет тенденцию к barf на основе self-referencing на основе DELETE /' UPDATE' (об этом я писал в DBA StackExchange: http: //dba.stackexchange.com/a/1384/877), Reason2) В репликации MySQL нет гарантии порядка строк. Таким образом, последние 10 строк могут отличаться от подчиненного, чем от его главного. – RolandoMySQLDBA

0

Вы должны собрать 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 РЕГИСТРИРУЙТЕСЬ

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; 

Дайте ему попробовать !!!

0

Вы также можете использовать вариант метода поиска 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))) 

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

+0

'MySQL версия сервера для правильного синтаксиса для использования рядом с FROM FROM tten WHID t2.created> t1.created))) 'в строке 4' – user2372936

0

ОК, это 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 y.t >= x.t 
     GROUP 
      BY x.t 
     HAVING COUNT(*) = 10 
    ) b 
    ON b.t >= a.t; 

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 | 
+---------------------+ 
Смежные вопросы