2011-06-29 11 views

Odpowiedz

32

Aby usunąć wszystkie oprócz ostatnich 10 rekordów.

delete 
from test 
where id not in (
    select id 
    from test 
    order by date desc 
    limit 10 
) 
+0

Dzięki. Ale skąd mam wiedzieć, ile rekordów muszę usunąć? – ahmd0

+1

Nie, zapytanie usuwa wszystkie oprócz 10 rekordów. –

+0

Dzięki, zadziałało. Chociaż twoje wyrażenie sql nie potrzebuje * – ahmd0

1

Według SQLite documentation:

Jeśli SQLite jest skompilowany z opcją kompilacji SQLITE_ENABLE_UPDATE_DELETE_LIMIT, wówczas składnia DELETE jest rozszerzony poprzez dodanie opcjonalnego ORDER BY i klauzule LIMIT.

(...)

Jeśli DELETE zawiera klauzulę ORDER BY, to wszystkie wiersze, które zostaną usunięte w przypadku braku klauzuli LIMIT są klasyfikowane według ORDER BY. Pierwsze M wierszy, gdzie M jest wartością znalezioną przez ocenę wyrażenia klauzuli OFFSET, są pomijane, a następujące N, gdzie N jest wartością wyrażenia LIMIT, są usuwane. Jeśli pozostało mniej niż N wierszy po uwzględnieniu klauzuli OFFSET lub jeśli klauzula LIMIT została oceniona na wartość ujemną, wówczas wszystkie pozostałe wiersze zostaną usunięte.

Pozwoliłoby to napisać:

DELETE FROM table WHERE expr ORDER BY date DESC LIMIT -1 OFFSET 10 
+0

~ "Jeśli pozostało mniej niż N wierszy". Co oznacza tutaj -1? –

+0

@IgorGanapolsky Spójrz na ostatnie zdanie cytowanego akapitu: _if Klauzula LIMIT jest oceniona na wartość ujemną, wtedy wszystkie pozostałe wiersze są usuwane_. –

+0

Więc jeśli w tabeli jest mniej niż 10 wierszy, wszystkie zostaną usunięte? –

2

zachować tylko ostatnie 10 rekordów, pomyśl odwrócony.

Aby usunąć starsze 10 rekordów:

DELETE FROM Table_name 
WHERE date in (SELECT date FROM Table_name ORDER BY Date Desc Limit -1 
       OFFSET (select count(*)-10 from Table_name)); 

Daj mi znać, jak to działa dla Ciebie!

+0

Czy data musi być w określonym formacie - np. Rrrr-mm-dd? –

0

Zakładając masz kolumnę id która jest numer porządkowy (AUTO INCREMENT), można użyć następujących:

DELETE FROM table_name 
WHERE id < (
    SELECT MIN(id) 
    FROM (SELECT id 
      FROM table_name 
      ORDER BY id DESC 
      LIMIT num_of_records_to_keep)) 

To samo zapytanie może być wykorzystywane przy użyciu kolumny timestamp (wystarczy wymienić id z datownika kolumna)

Powiązane problemy