MySQL专家:删除所有早于x天的行,但不删除最新的行

MySQL专家:删除所有早于x天的行,但不删除最新的行,mysql,Mysql,首先,这是创建玩家历史的查询 它可以根据您的需要随时执行,并且仅当昨天没有历史记录行或者自过去的最新历史记录条目以来值发生更改时,才会为玩家创建新的历史记录行 INSERT INTO `player_history` (`player_id`, `date`, `races`, `maps`, `playtime`, `points`) SELECT `p`.`id`, DATE_SUB(NOW(), INTERVAL 1 DAY), `p`.`races`, `p`.`maps`, `p`.`

首先,这是创建玩家历史的查询 它可以根据您的需要随时执行,并且仅当昨天没有历史记录行或者自过去的最新历史记录条目以来值发生更改时,才会为玩家创建新的历史记录行

INSERT INTO `player_history` (`player_id`, `date`, `races`, `maps`, `playtime`, `points`)
SELECT `p`.`id`, DATE_SUB(NOW(), INTERVAL 1 DAY), `p`.`races`, `p`.`maps`, `p`.`playtime`, `p`.`points`
FROM `player` `p`
WHERE `p`.`playtime` IS NOT NULL
AND `p`.`playtime` > 0
AND (
    SELECT `player_id`
    FROM `player_history`^
    WHERE `player_id` = `p`.`id`
    AND (
        `date` = DATE_SUB(NOW(), INTERVAL 1 DAY)
        OR (
            `date` < DATE_SUB(NOW(), INTERVAL 1 DAY)
            AND `races` = `p`.`races`
            AND `points` = `p`.`points`
            AND `maps` = `p`.`maps`
            AND `playtime` = `p`.`playtime`
        )
    )
    ORDER BY `date` DESC
    LIMIT 1
) IS NULL;
现在的问题是,我还想使用一个查询来清理历史记录表。这已经选择了所有超过10天但最新的历史记录条目。但我不能只喜欢删除而不选择*

SELECT *
FROM `player_history` `ph`
WHERE `date` < DATE_SUB(NOW(), INTERVAL 10 DAY)
AND `date` != (SELECT `date`
    FROM `player_history`
    WHERE `player_id` = `ph`.`player_id`
    ORDER BY `date` DESC
    LIMIT 1);

那么,有三种方法可以使用单个删除查询实现我想要的功能吗?

在我看来,您的查询是正确的,但子查询中没有间隔

我会这样做:

DELETE FROM player_history
WHERE date < DATE_SUB(NOW(), INTERVAL 10 DAY)
AND date != (
    SELECT MAX(date) FROM player_history
    WHERE date < DATE_SUB(NOW(), INTERVAL 10 DAY)
)

mysql的错误消息是什么?

可能您无法在一个查询中执行此操作,因为以下状态:

当前,不能从表中删除,也不能从子查询中的同一表中选择

作为一种解决方法,您可以选择必须删除到临时表中的行的ID,然后使用multi-table delete语句从原始表中删除记录