在sqlite中删除+订单(Android)

Add*_*dev 4 sqlite

我有一个表用于保存我的应用程序的排名与以下字段:[id,username,score]我想清理表只保留前100个条目.

我怎么能这样删除?我试过DELETE FROM ranking ORDER BY score DESC LIMIT 100,999999999)但它返回一个错误:

Error: near "ORDER": syntax  error
Run Code Online (Sandbox Code Playgroud)

我考虑的其他选择是:

DELETE FROM ranking WHERE id NOT IN (SELECT id FROM ranking ORDER BY score 
  DESC LIMIT 100)
Run Code Online (Sandbox Code Playgroud)

但我不知道它是否有效

rai*_*7ow 12

我想你正在寻找这个:

DELETE FROM ranking WHERE id NOT IN (
    SELECT id FROM ranking ORDER BY score DESC LIMIT 100);
Run Code Online (Sandbox Code Playgroud)

这是演绎概念的SQL小提琴.

它非常有效(事实上,它非常典型),因为嵌套查询只执行一次.它实际上更多地取决于"得分"是否被索引覆盖 - 或者不是:

(没有索引):

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
Run Code Online (Sandbox Code Playgroud)

(之后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)
Run Code Online (Sandbox Code Playgroud)