2012-10-23 46 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子句...你的子查询将返回多个列 –