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个。