【问题标题】:MySQL Specialists: Delete all rows older than x days but not the latest oneMySQL 专家:删除所有早于 x 天但不是最新的行
【发布时间】:2010-10-13 21:11:27
【问题描述】:

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

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 天但最新的历史记录条目。但我不能像做 DELETE 而不是 SELECT *。

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);

那么是一种使用单个删除查询来做我想做的事情的方法吗?

【问题讨论】:

    标签: mysql


    【解决方案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的错误信息是什么?

    【讨论】:

      【解决方案2】:

      您可能无法在单个查询中执行此操作,因为 documentation 声明:

      目前,您不能在子查询中从表中删除并从同一个表中进行选择。

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

      【讨论】:

        猜你喜欢
        • 2014-02-07
        • 1970-01-01
        • 1970-01-01
        • 2015-02-17
        • 1970-01-01
        • 1970-01-01
        • 2013-12-19
        • 2017-07-28
        • 1970-01-01
        相关资源
        最近更新 更多