Специалисты по MySQL: Удалите все строки старше x дней, но не самую последнюю

во-первых, это запрос, который создает "историю игроков" он может выполняться так часто как вы хотите, и он будет создавать новые строки истории для игроков только в том случае, если нет строки истории за вчерашний день или если значения изменились с момента последней записи истории в прошлом.

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

Так есть ли способ сделать то, что я хочу, с помощью одного запроса на удаление?

8
задан Andreas Linden 13 October 2010 в 21:11
поделиться