4

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

我该怎么做这个删除?我试过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)

但我不知道它是否有效

4

6 回答 6

12

我想你正在寻找这个:

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)
于 2012-10-23T10:51:07.367 回答
3

所有行都有内置字段rowid。试试这个:

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

您可以在此处阅读更多相关信息

于 2012-10-23T10:51:29.450 回答
1

试试这个:

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

假设您的 ID 列没有重复项

于 2012-10-23T10:49:53.570 回答
0

你可以试试这个

delete from ranking where id not in
 (select top(100) * from ranking order by score)
于 2012-10-23T10:52:04.900 回答
0

这里的答案是处理您的情况的好方法。我想添加一个答案来解释您的语法错误的来源。

DELETE 上的 ORDER 和 LIMIT 子句是 sqlite 的编译时选项。我只是花了几个小时艰难地学习这一点:D。

来自https://www.sqlite.org/compile.html#enable_update_delete_limit

SQLITE_ENABLE_UPDATE_DELETE_LIMIT

此选项在 UPDATE 和 DELETE 语句上启用可选的 ORDER BY 和 LIMIT 子句。

如果定义了这个选项,那么在使用 Lemon 解析器生成器工具生成 parse.c 文件时也必须定义它。因此,仅当库是从源代码构建时才可以使用此选项,而不是从合并或从网站上为非类 Unix 平台提供的预打包 C 文件的集合中构建的。

于 2019-01-05T19:54:13.797 回答
-2

某些单词,如 SELECT、DELETE 或 BIGINT [或 ORDER] 是保留的,需要特殊处理才能用作表名和列名等标识符。

传统的 MySQL 报价:

DELETE FROM ranking ORDER BY `score` DESC;

正确的 (ANSI) SQL 引号(一些数据库也支持 [order]):

DELETE FROM ranking ORDER BY "score" DESC;

尽管我会考虑重命名该列以避免将来出现此类令人困惑的问题。

于 2012-10-23T10:49:35.700 回答