基于时间戳的MySql嵌套删除

基于时间戳的MySql嵌套删除,mysql,sql,sql-delete,Mysql,Sql,Sql Delete,我有一个数据库,包含CMS驱动的网站的所有内容更新。我想创建一个查询来清除所有的旧内容,但给我留下每个页面的最近几(5)份副本(以防万一)。该表包含一个时间戳字段和一个页面ID字段,以帮助我找到正确的行。PrimaryKey是一个名为RevisionId的字段。当然还有其他字段(例如包含页面内容),但它们与这个问题无关 我可以很好地执行此查询: SELECT RevisionId FROM `content` WHERE PageId='55' ORDER BY Time

我有一个数据库,包含CMS驱动的网站的所有内容更新。我想创建一个查询来清除所有的旧内容,但给我留下每个页面的最近几(5)份副本(以防万一)。该表包含一个时间戳字段和一个页面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

问题分两部分:

  • 我需要做什么来解决我目前遇到的错误
  • 有没有一种方法可以通过我的 整张桌子…不仅仅是PageId='55' 但是所有不同的PageId号
  • 这是一个大胆的尝试:

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

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

    错误:#1093-您不能在FROM子句中指定更新的目标表“c”,这意味着我必须退出MySQL并使用PHP运行一系列命令来创建数据库,然后执行删除操作,然后删除临时数据库?…这正是我希望避免的。@techtheatre:不可能从PHP运行多语句MySQL查询吗?是的…我只是希望我可以在一组嵌套查询或其他东西中完成整个任务。看来我必须用PHP来做这件事,这完全没问题……我只是希望有一种更“本地”的方式来处理它。