我有一個SQL表與新聞故事和Unix時間戳。我只想保留50個最新的故事。我將如何編寫一條SQL語句來刪除任何數量的舊故事?刪除所有,但50個最新的行
3
A
回答
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,和你不能刪除一切都在這些價值...
-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;
你必須有兩個原因做這種方式 -
-
子查詢中進行刪除
- MySQL的5不支持限制
- MySQL 5不允許您從要從中刪除的同一個表中的子查詢中進行選擇。
2
如果你有很多行,它可能是更好地把50行臨時表 然後用TRUNCATE TABLE清空表出來。然後把50行回。
相關問題
- 1. 如何刪除所有行除了50最新
- 2. MySQL的 - 刪除所有,但最新的行與複合鍵
- 3. 刪除所有行,但每個組的最大值一個
- 4. 刪除所有,但1個最新的文件慶典
- 5. 如何刪除超過50個計數的所有行?
- 6. (SQL)刪除除最新的一行外的所有行
- 7. 刪除所有小數,但最後
- 8. 刪除所有但最新的文件夾中的Python
- 9. 刪除所有,但
- 10. 退出並刪除所有但最新的碼頭集裝箱
- 11. 刪除所有文件,但保留最新的文件
- 12. PHP&MySQL:刪除所有保留最新行的25行的所有舊行
- 13. 刪除文件夾內的所有文件,但刪除最後?
- 14. 刪除除最新10個以外的所有目錄
- 15. 刪除除4個最新目錄以外的所有文件
- 16. 從一個月中刪除所有文件,但是刪除最後一個
- 17. 刪除一個字符串後的所有行,但最後幾個
- 18. 刪除表中的所有數據,但最後N個條目
- 19. 每個時間段刪除除最新一行以外的所有內容
- 20. 刪除所有行,並保持最新的X左
- 21. 如何從表中刪除除最新的10行以外的所有行
- 22. bash命令刪除所有,但最後5個目錄
- 23. 刪除50個Git分支?
- 24. 刪除所有行
- 25. 刪除所有空白行,但留下兩個空行
- 26. 刪除所有,但一個行基於幾個標識符
- 27. 刪除所有行除了
- 28. 刪除行所以我有一個最大行限制
- 29. 想要刪除文件中的所有行,但保留最後50000行
- 30. 刪除除最新5條以外的所有記錄
這裏假設你有順序編號的,這通常是一個合理的假設LIMIT的。如果你不這樣做,你需要利用數據庫中的時間戳或其他順序字段來做到這一點 – 2008-09-28 19:33:30
看起來沒有工作,只是得到錯誤:#1235 - 這個版本的MySQL不會' t還支持'限制和IN /所有/任何/某些子查詢' – Gilean 2008-09-28 19:37:28
當然,子查詢應該是「從表中選擇ID」,而不是「從表中選擇*」? – Blorgbeard 2008-09-28 19:38:00