2012-01-16 24 views
8

php sitemde her saat çalışan bir komut dosyası var. Bu betikte bir tür MySQL sorgusunun bir tablodaki her kaydı silip bitirmesini istiyorum ama en son 50.MySQL DELETE tüm ancak sonuncu X kayıtları

Böyle bir şeyi nasıl yaparım?

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

Tablonuza bir zaman damgası alanı ekleyebilir misiniz? –

+0

Kimlik sütununuz, 1 değerini otomatik olarak geçiren bir kimlik sütunuysa, şu şekilde bir şey yapabilirsiniz: 'SİLİNDEN SİLME KİMLİĞİNDE BULUNAMADI (ÜST SAYFA ORTAK İSTEĞE GÖRE SEÇENEK 50 ID SEÇİN)' – pistipanko

+0

datetime alanı – user1022585

cevap

14

Sen DEĞİL İÇİNDE kullanarak deneyebilirsiniz:

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

Bu SQL Server'ın içindir:

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

yüksek değerler varsayarsak

DÜZENLEME MySQL için id her zaman daha yenidir.

+0

Bu ID'leri DESCending düzeninde sipariş edin. –

+0

Bu işe yaramadı çalıştı:/Bu – user1022585

+0

Whoops yardımcı olur eğer ben de 'date' alanı var. Sorunuz SQL ile etiketlenmiştir - şimdi MySQL çözümünü kullanarak deneyin. – Brissles

0

Böyle bir şey deneyebilirsiniz:

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

kimliği için değerleriniz 1 basamak artırılır Yoksa gibi bir şey kullanabilirsiniz, bu işe yarar: is İÇİNDE

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

bunlardan herhangi birini alamıyor: o – user1022585

+0

Hangi veritabanı sistemini kullanıyorsunuz? – Mithrandir

2

DEĞİL yetersiz. Bu gibi görünmesi için @Mithrandir tarafından önceki seçeneği hafifçe değiştirebilirsiniz (

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)); 
İlgili konular