基于Timestamp在MySql中嵌套删除

时间:2011-05-23 04:50:03

标签: mysql sql sql-delete

我有一个包含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 :(得分:0)

这是一个疯狂的尝试:

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 );

答案 1 :(得分:0)

目前,mysql无法处理带有子查询的删除语句到同一个表。您需要创建临时表以获取最新行的列表,然后在子查询中使用它。