mysql - MySql中基于时间戳的嵌套删除

标签 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 subquery'

我正在运行 MySQL 5。

两部分问题:

  1. 我需要做什么来解决目前遇到的错误?
  2. 有没有办法进一步自动化它来运行我的 整个表...不仅仅是 PageId='55' 但所有不同的 PageId 编号?

最佳答案

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

关于mysql - MySql中基于时间戳的嵌套删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6092966/

相关文章:

php - 具有多个值的 MySQL 'or' 语句

php - 如何在 PHP 中查看图像并更新

sql - SQL Server中如何统计每位老师的学生和类(class)?

php - 使用 Laravel 查询生成器和 LEFT JOIN 删除行

mysql - 显示 2 没有连接的总和

创建外键的 SQL Compact (CE) 问题

python - 将带有 JOIN ON 的 SQL 查询转换为 SQLAlchemy

mysql - DELETE 查询给出 "operand should contain 1 column"错误

sql - 棘手的删除。我如何能?

php - 在 Laravel 中的关系表中添加 where 子句