MySQL УДАЛИТЬ все кроме последних X записей - PullRequest
9 голосов
/ 17 января 2012

У меня есть скрипт, который запускается каждый час на моем php-сайте. В этом сценарии я бы хотел, чтобы какой-то запрос MySQL удалял каждую запись из таблицы, но, скажем, последние 50.

Как бы я сделал что-то подобное?

// pseudo code: like this?
DELETE from chat WHERE id = max (ID - 50) 

Ответы [ 3 ]

16 голосов
/ 17 января 2012

Можно попробовать использовать NOT IN:

РЕДАКТИРОВАТЬ для MySQL :

DELETE FROM chat WHERE id NOT IN ( 
  SELECT id 
  FROM ( 
    SELECT id 
    FROM chat 
    ORDER BY id DESC 
    LIMIT 50
  ) x 
); 

Это для SQL-Server :

DELETE FROM chat WHERE id NOT IN 
    (SELECT TOP 50 id FROM chat ORDER BY id DESC)  

Предполагая, что более высокие значения id всегда новее.

2 голосов
/ 09 июня 2015

NOT IN неэффективно. Вы можете немного изменить первый вариант в предыдущем ответе @Mithrandir, чтобы он выглядел так:

DELETE from chat WHERE id < 
  (SELECT id FROM 
    (SELECT id FROM chat ORDER BY id DESC LIMIT 50) t ORDER BY id ASC LIMIT 1));
0 голосов
/ 17 января 2012

Вы можете попробовать что-то вроде этого:

DELETE from chat WHERE id < (SELECT max(ID)-50 FROM chat) 

Это будет работать, если ваши значения для ID увеличиваются с шагом 1. Или вы можете использовать что-то вроде:

DELETE FROM chat WHERE id NOT IN 
    (SELECT id FROM ( SELECT ID FROM chat ORDER BY datetime_col DESC LIMIT 50) t ) -- mysql
...