2012-10-23 43 views
4

我有一個表用於保存我的應用程序的排名與以下字段:[id,username,score]和我想清理表只保留前100個條目。在sqlite(Android)中刪除+排序

我該怎麼做這個刪除?我試過DELETE FROM ranking ORDER BY score DESC LIMIT 100,999999999)但它返回一個錯誤:

Error: near "ORDER": syntax error 

我已經考慮其他替代方案是:

DELETE FROM ranking WHERE id NOT IN (SELECT id FROM ranking ORDER BY score 
    DESC LIMIT 100) 

,但我不知道這是否是有效的足夠多的

+0

的[限制的SQLite表的最大行數(HTTP可能重複://計算器.com/questions/2035670/limit-an-sqlite-tables-maximum-number-of-rows) –

+2

你的第二個選擇是這樣做的一個典型方法。 –

回答

10

我想你正在尋找這樣的:

DELETE FROM ranking WHERE id NOT IN (
    SELECT id FROM ranking ORDER BY score DESC LIMIT 100); 

這裏的SQL Fiddle說明的概念。

它非常高效(實際上,它非常典型),因爲嵌套查詢只執行一次。它實際上更多地取決於 '分數' 是否被索引所覆蓋的 - 或不:

(無指標):

EXPLAIN QUERY PLAN DELETE FROM ranking WHERE id NOT IN (
    SELECT id FROM ranking AS ranking_subquery ORDER BY score DESC LIMIT 2); 

-- 
selectid order from detail 
0   0  0  SCAN TABLE ranking (~500000 rows) 
0   0  0  EXECUTE LIST SUBQUERY 0 
0   0  0  SCAN TABLE ranking AS ranking_subquery (~1000000 rows) 
0   0  0  USE TEMP B-TREE FOR ORDER BY 

(後CREATE INDEX ts ON ranking(score);

selectid order from detail 
0   0  0  SCAN TABLE ranking (~500000 rows) 
0   0  0  EXECUTE LIST SUBQUERY 0 
0   0  0  SCAN TABLE ranking AS ranking_subquery USING INDEX ts (~1000000 rows) 
+0

@Addev對不起,在看到你的編輯之前寫了我的查詢。我希望這會回答第二部分(關於效率)。 ) – raina77ow

-2

某些詞語,如SELECT,DELETE或BIGINT [或ORDER]被保留,需要特殊處理才能用作表名和列名等標識符。

傳統的MySQL報價:

DELETE FROM ranking ORDER BY `score` DESC; 

正確(ANSI)SQL引號(一些數據庫的支持[順序]也一樣):

DELETE FROM ranking ORDER BY "score" DESC; 

雖然我會考慮重新命名列,以避免這樣的混亂未來的問題。

1

試試這個:

DELETE FROM ranking WHERE id NOT IN 
    (SELECT id FROM ranking ORDER BY SCORE limit 100) 

Asssume您的ID列沒有重複

2

所有行具有內置在字段rowid。試試這個:

DELETE FROM [tbl_names] WHERE rowid not in 
(select rowid from [tbl_name] order by score desc limit 100) 

你可以閱讀更多有關here

+0

但是,這將保持100個最舊的條目,而不是100個最重要的條目? –

+0

你說得對。我修好了它。非常感謝。 – Ahmad

0

你可以試試這個

delete from ranking where id not in 
(select top(100) * from ranking order by score) 
+0

在SQLite中沒有TOP子句...你的子查詢將返回多個列 –