MySQL Удалить все записи, которые не выбраны

Я пытаюсь удалить все записи, кроме 25 самых последних, на основе метки времени. Я пробовал это:

DELETE FROM `chat` WHERE `IndexNo` NOT IN(SELECT `IndexNo` FROM `chat` ORDER BY `Timestamp` DESC LIMIT 25)

Это генерирует эту ошибку:

#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

Есть ли способ сделать это?


person Styles2304    schedule 29.08.2013    source источник
comment
Какую версию MySQL вы используете?   -  person Alberto Megía    schedule 29.08.2013
comment
Если только я не оторван от реальности, то действительно не имеет значения, какую версию они используют.   -  person Strawberry    schedule 29.08.2013


Ответы (2)


Вы не можете полагаться на LIMIT в IN/ALL/ANY/SOME подзапросах, но вместо этого вы можете использовать синтаксис множественного удаления:

DELETE 
  `chat` 
FROM 
  `chat` 
    LEFT JOIN (SELECT `IndexNo` FROM `chat` ORDER BY `Timestamp` DESC LIMIT 25) AS `selected`
      ON `chat`.`IndexNo`=`selected`.`IndexNo` 
WHERE 
  `selected`.`IndexNo` IS NULL;

- согласно руководству, это будет работать, начиная с MySQL 5.0

person Alma Do    schedule 29.08.2013

Думаю, это более общая проблема с подзапросом. Попробуйте посмотреть здесь: Проблема с LIMIT и IN/ALL/ANY /НЕКОТОРЫЙ подзапрос

person gpicchiarelli    schedule 29.08.2013