MySQL Spezialisten: Löschen Sie alle Zeilen, die älter als x Tage, aber nicht die Letzte
zunächst, dies ist die Abfrage, die erstellt die "Spieler der Geschichte"
es kann so Häufig ausgeführt werden, wie Sie wollen und es wird nur neues Geschichte-Reihen für die Spieler, wenn es keine Geschichte Zeile für gestern, oder wenn die Werte sich geändert, seit der neuesten Geschichte-Eintrag in die Vergangenheit.
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;
nun das problem ist, ich möchte auch zu Bereinigung der history-Tabelle mit einer einzigen Abfrage. diese bereits selektiert alle Einträge, die älter als 10 Tage, aber die neuesten. aber ich kann, wie LÖSCHEN, anstatt 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);
so tehre ist ein Weg, das zu tun, was ich will, mit einer einzigen Abfrage löschen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Abfrage sieht in meinen Augen aber nicht das Intervall in der Unterabfrage.
Ich würde dies tun:
Was ist die Fehlermeldung von mysql?
Wahrscheinlich können Sie nicht tun dies in einer einzigen Abfrage, weil die Dokumentation Staaten:
Als workaround könnten Sie die ids der Zeilen, die gelöscht werden in eine temporäre Tabelle und dann mit einem multi-table delete-Anweisung löschen Sie die Datensätze aus der ursprünglichen Tabelle.