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を次に示します。

ネストされたクエリは 1 回だけ実行されるため、非常に効率的です (実際、非常に一般的です)。実際には、「スコア」がインデックスでカバーされているかどうかによって異なります。

(インデックスなし):

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 に答える
-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 に答える