我有一个数据库,其中包含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/AANY/SOME子查询'
我正在运行MySQL 5。
由两部分组成的问题:
- 到目前为止,我需要做些什么来解决我遇到的错误
- 有没有一种方法可以进一步自动化整张表。。。不仅仅是PageId='55'但是所有不同的PageId数字
当前mysql无法处理带有子查询的delete语句。您需要创建临时表来获取最近行的列表,然后在子查询中使用它。
这是一次疯狂的尝试:
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 );