繁体   English   中英

基于时间戳在MySql中嵌套删除

[英]Nested Delete in MySql based on Timestamp

我有一个数据库,其中包含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号码?

这是一个疯狂的尝试:

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语句。 您需要创建临时表以获取最新行的列表,然后在子查询中使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM