2008-09-28 51 views

回答

6

我結束了使用兩個查詢,因爲MySQL5的還不支持子查詢

SELECT unixTime FROM entries ORDER BY unixTime DESC LIMIT 49, 1; 
DELETE FROM entries WHERE unixTime < $sqlResult; 
8

塊引用

delete from table where id not in (
    select id from table 
    order by id desc 
    limit 50 
) 

你選擇你不想刪除數據的ID,和你不能刪除一切都在這些價值...

+0

這裏假設你有順序編號的,這通常是一個合理的假設LIMIT的。如果你不這樣做,你需要利用數據庫中的時間戳或其他順序字段來做到這一點 – 2008-09-28 19:33:30

+0

看起來沒有工作,只是得到錯誤:#1235 - 這個版本的MySQL不會' t還支持'限制和IN /所有/任何/某些子查詢' – Gilean 2008-09-28 19:37:28

+0

當然,子查詢應該是「從表中選擇ID」,而不是「從表中選擇*」? – Blorgbeard 2008-09-28 19:38:00

-2

也許不是最有效的,但這應該工作:

DELETE FROM _table_ 
WHERE _date_ NOT IN (SELECT _date_ FROM _table_ ORDER BY _date_ DESC LIMIT 50) 
-1

假設這個查詢選擇你想保留的行:

SELECT timestampcol FROM table ORDER BY timestampcol DESC LIMIT 49,1; 

然後,你可以使用子查詢,像這樣:

DELETE FROM table WHERE timestampcol < (SELECT timestampcol FROM table ORDER BY timestampcol DSEC LIMIT 49,1) 

當然,要確保你有做任何潛在的破壞性之前創建一個備份。請注意,與其他使用IN的方法相比,這個方法可以避免爲要刪除的每一行執行50個整數比較,假設我獲得了正確的SQL,則可以使其快50倍。

3

那麼,它看起來像你不能在一個查詢中做 - 有人糾正我,如果我錯了。我能夠做這種事情的唯一方法是首先計算表中的行數。例如:

select count(*) from table; 

然後使用結果做

delete from table order by timestamp limit result - 50; 

你必須有兩個原因做這種方式 -

    子查詢中進行刪除
  1. MySQL的5不支持限制
  2. MySQL 5不允許您從要從中刪除的同一個表中的子查詢中進行選擇。
2

如果你有很多行,它可能是更好地把50行臨時表 然後用TRUNCATE TABLE清空表出來。然後把50行回。

相關問題