2012-01-16 11 views
8

Mam skrypt, który działa co godzinę na mojej witrynie php. W tym skrypcie chciałbym jakiejś kwerendy MySQL, aby usunąć każdy rekord z tabeli, ale powiedzmy, że 50.MySQL USUŃ wszystkie oprócz najnowszych rekordów X

Jak bym coś takiego zrobił?

// pseudo code: like this? 
DELETE from chat WHERE id = max (ID - 50) 
+0

Czy możesz dodać pole datownika do swojego stołu? –

+0

Jeśli kolumna ID jest kolumną tożsamości z autoinkrecją 1, możesz zrobić coś takiego: 'USUŃ Z czatu GDZIE ID NIE ZNAJDUJE (WYBIERZ NAJLEPSZE 50 ID Z POCHODZENIA PRZEZ ID DESC)' – pistipanko

+0

Mam datetime field – user1022585

Odpowiedz

14

Można spróbować użyć NOT IN:

EDIT dla MySQL:

DELETE FROM chat WHERE id NOT IN ( 
    SELECT id 
    FROM ( 
    SELECT id 
    FROM chat 
    ORDER BY id DESC 
    LIMIT 50 
) x 
); 

To dla SQL Server:

DELETE FROM chat WHERE id NOT IN 
    (SELECT TOP 50 id FROM chat ORDER BY id DESC) 

Zakładając wyższe wartości z id są zawsze nowsze.

+0

Lepsze zamawianie tych identyfikatorów w kolejności DESCending. –

+0

Próbowałem to nie działa:/Mam również pole 'date', jeśli to pomaga – user1022585

+0

Whoops. Twoje pytanie jest oznaczone przez SQL - spróbuj teraz używając rozwiązania MySQL. – Brissles

0

Można spróbować czegoś takiego:

DELETE from chat WHERE id < (SELECT max(ID)-50 FROM chat) 

to będzie działać, jeśli wartości ID są zwiększane w krokach co 1 lub można użyć coś takiego:

DELETE FROM chat WHERE id NOT IN 
    (SELECT id FROM (SELECT ID FROM chat ORDER BY datetime_col DESC LIMIT 50) t) -- mysql 
+0

nie można uzyskać żadnej z poniższych opcji: o – user1022585

+0

Jakiego systemu baz danych używasz? – Mithrandir

2
NOT IN jest

nieskuteczny. Możesz nieznacznie zmodyfikować pierwszą opcję z poprzedniej odpowiedzi @Mithrandir, aby wyglądała następująco:

DELETE from chat WHERE id < 
    (SELECT id FROM 
    (SELECT id FROM chat ORDER BY id DESC LIMIT 50) t ORDER BY id ASC LIMIT 1)); 
Powiązane problemy