Вложенное удаление в MySql на основе отметки времени - PullRequest
1 голос
/ 23 мая 2011

У меня есть база данных, содержащая все обновления контента для сайта, управляемого CMS. Я хочу создать запрос, который очистит все старые вещи, но оставит мне последние несколько (5) копий каждой страницы (на всякий случай). Таблица содержит поле TIMESTAMP и поле PAGE ID, чтобы помочь мне найти правильные строки. PrimaryKey - это поле с именем RevisionId. Конечно, есть и другие поля (например, содержащие содержимое страницы), но они не имеют отношения к этому вопросу.

У меня нормально работает этот запрос:

  SELECT RevisionId 
    FROM `content` 
   WHERE PageId='55' 
ORDER BY Timestamp DESC LIMIT 5;

Возвращает пять записей, которые я хочу сохранить.

Я думал, что смогу вложить это так:

DELETE 
  FROM `content` 
 WHERE PageId='55' 
   AND RevisionId NOT IN ( 
           SELECT RevisionId 
             FROM `content` 
            WHERE PageId='55' 
         ORDER BY Timestamp DESC LIMIT 5 );

... но это дает мне ошибку:

# 1235 - Эта версия MySQL еще не поддерживает подзапрос «LIMIT & IN / ALL / ANY / SOME»

Я использую MySQL 5.

Вопрос из двух частей:

  1. Что мне нужно сделать, чтобы устранить ошибку, которую я получаю до сих пор?
  2. Есть ли способ дополнительно автоматизировать это, чтобы запустить через мой вся таблица ... не только PageId = '55 ' но все разные номера PageId?

Ответы [ 2 ]

0 голосов
/ 23 мая 2011

В настоящее время mysql не может обработать операторы удаления с подзапросами к той же таблице. Вам нужно создать временную таблицу, чтобы получить список самых последних строк, а затем использовать ее в подзапросе.

0 голосов
/ 23 мая 2011

Это дикая попытка:

DELETE c FROM `content` AS c WHERE PageId='55' AND NOT EXISTS ( SELECT 1 FROM `content` WHERE PageId='55' AND c.RevisionId = content.RevisionId ORDER BY content.Timestamp DESC LIMIT 5 );
...