Mysql 如果计数超过10,则删除子记录
我对以下表具有父子关系:Mysql 如果计数超过10,则删除子记录,mysql,Mysql,我对以下表具有父子关系: CREATE TABLE `pages` ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(100) NULL, PRIMARY KEY ( id ) ) CREATE TABLE `pageObjects` ( id INT NOT NULL AUTO_INCREMENT, object TEXT NULL, lastChanged TIMESTAMP on update C
CREATE TABLE `pages` (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(100) NULL,
PRIMARY KEY ( id )
)
CREATE TABLE `pageObjects` (
id INT NOT NULL AUTO_INCREMENT,
object TEXT NULL,
lastChanged TIMESTAMP on update CURRENT_TIMESTAMP NOT NULL,
fkPageId int NOT NULL,
PRIMARY KEY ( id )
)
页面与pageObjects之间存在一对多关系
每当连接到单个页面的pageObjects记录超过10条时,必须删除过去编辑最远且超过10条的所有记录
我想在一个查询中实现这一点,但我似乎无法理解这一点
这就是我取得的成绩:
DELETE
FROM pageObjects
WHERE id NOT IN (
SELECT po.id, po.fkPageId FROM (
SELECT objects.fkPageId FROM (
SELECT COUNT(*) as count, fkPageId
FROM pageObjects
GROUP BY fkPageId
) objects
WHERE count > 10
) AS page
JOIN pageObjects po
ON page.fkPageId = po.fkPageId
AND po.lastChanged < (
SELECT MIN(lastChanged )
FROM pageObjects
WHERE fkPageId = po.fkPageId
GROUP BY fkPageId
ORDER BY lastChanged DESC
LIMIT 10
)
)
遗憾的是,底部子查询中的LIMIT位没有按我希望的方式工作,因为MIN函数应该在应用LIMIT之后应用
所以我试着:
DELETE
FROM pageObjects
WHERE id NOT IN (
SELECT po.id, po.fkPageId FROM (
SELECT objects.fkPageId FROM (
SELECT COUNT(*) as count, fkPageId
FROM pageObjects
GROUP BY fkPageId
) objects
WHERE count > 10
) AS page
JOIN pageObjects po
ON page.fkPageId = po.fkPageId
AND po.lastChanged < (
SELECT MIN(lastChanged)
FROM (
SELECT lastChanged
FROM pageObjects
WHERE fkPageId = po.fkPageId
GROUP BY fkPageId
ORDER BY lastChanged DESC
LIMIT 10
)
)
)
但这是不可能的,因为po.fkPageId在子查询的子查询中不可用
有什么方法可以这样做吗?您只需计算每个id后面的条目数即可:
DELETE FROM pageObjects
WHERE id IN (
SELECT id FROM pageObjects po
WHERE (
SELECT count(id)
FROM pageObjects po2
WHERE po2.fkPageId = po.fkPageId
AND po2.lastChanged > po.lastChanged
) > 10
)
在此处查看select返回的内容:
这很有效。这里要做的是获取所有比10个同级记录早的记录,对吗?很不错的。谢谢你的洞察力!是的,没错。通过删除超过10个弟弟妹妹的所有记录,本质上只剩下最近的10个。