MySQL LÖSCHEN alle, aber die Letzte X Einträge
Ich habe ein script, welches jede Stunde auf meine php-Seite. In diesem Skript möchte ich eine Art MySQL-Abfrage zu löschen jeden Datensatz aus einer Tabelle aber sagen, dass die letzten 50.
Wie würde ich so etwas tun?
// pseudo code: like this?
DELETE from chat WHERE id = max (ID - 50)
- Können Sie fügen Sie eine timestamp-Feld auf Ihren Tisch?
- Wenn Sie Ihre ID-Spalte ist eine identity-Spalte mit autoincrement-1, könnten Sie tun somthing so:
DELETE FROM chat WHERE ID NOT IN(SELECT TOP 50 ID FROM chat ORDER BY ID DESC)
- Ich habe ein datetime-Feld
- Verwenden Sie In diesem Fall:
DELETE FROM chat WHERE datecol NOT IN(SELECT TOP 50 datecol FROM chat ORDER BY datecol DESC)-- SQL Server
DELETE FROM chat WHERE datecol NOT IN(SELECT datecol FROM chat ORDER BY datecol DESC LIMIT 50) --MySQL
- Ich denke, Sie sollten löschen nach einer Zeitspanne (zwischen x und x), sondern die Anzahl der Datensätze. Gibt es irgendein Grund, warum es die letzten 50, sondern als eine Zeit Periode/Spanne?
#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
- möglich, Duplikat der SQL-Abfrage: Löschen Sie alle Datensätze aus der Tabelle mit Ausnahme der neuesten N?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie könnten versuchen, mit NICHT, IN:
BEARBEITEN für MySQL:
Dies ist für SQL-Server:
Unter der Annahme höherer Werte
id
werden immer höher.date
Feld zu, ob das hilft#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
NICHT IN ist ineffizient. Sie können leicht ändern die erste option in der vorherigen Antwort von @Mithrandir, um es wie folgt Aussehen:
Könnten Sie versuchen, so etwas wie dieses:
Dieser würde funktionieren, wenn Ihre Werte für die ID inkrementiert werden in Schritten von 1. Oder können Sie etwas wie: