Запрос SQL: удалить все записи из таблицы, кроме последних N? - PullRequest
76 голосов
/ 23 февраля 2009

Можно ли создать один запрос MySQL (без переменных), чтобы удалить все записи из таблицы, кроме последнего N (отсортированного по id desc)?

Как то так, только не работает :) 1003 *

delete from table order by id ASC limit ((select count(*) from table ) - N)

Спасибо.

Ответы [ 16 ]

0 голосов
/ 19 февраля 2013

Отвечая на это через долгое время ... Наткнулся на ту же ситуацию, и вместо того, чтобы использовать упомянутые ответы, я пришел с ниже -

DELETE FROM table_name order by ID limit 10

Это удалит первые 10 записей и сохранит последние записи.

0 голосов
/ 14 февраля 2012

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

delete from table 
where access_time >= 
(
    select access_time from  
    (
        select access_time from table 
            order by access_time limit 150000,1
    ) foo    
)
0 голосов
/ 03 августа 2011

А как же:

SELECT * FROM table del 
         LEFT JOIN table keep
         ON del.id < keep.id
         GROUP BY del.* HAVING count(*) > N;

Возвращает строки, содержащие более N строк. Может быть полезным?

0 голосов
/ 23 февраля 2009

Это также должно работать:

DELETE FROM [table] INNER JOIN (SELECT [id] FROM (SELECT [id] FROM [table] ORDER BY [id] DESC LIMIT N) AS Temp) AS Temp2 ON [table].[id] = [Temp2].[id]
0 голосов
/ 23 февраля 2009

Почему бы не

DELETE FROM table ORDER BY id DESC LIMIT 1, 123456789

Просто удалите все, кроме первой строки (порядок DESC!), Используя очень очень большое число в качестве второго аргумента LIMIT. Смотрите здесь

0 голосов
/ 23 февраля 2009

УДАЛИТЬ ИЗ таблицы, ГДЕ ИДЕНТИФИКАТОР (ВЫБРАТЬ идентификатор из таблицы, ЗАКАЗАТЬ ПО идентификатору, desc LIMIT 0, 10)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...