2

という名前のテーブルがありますitems
構造は次のとおりです。 {name, id, category_id}

テーブルには不明な数のレコードがあります。各カテゴリのレコード数を最大数、たとえば 20 に制限する必要があります。

擬似

DELETE FROM items
WHERE (SELECT COUNT(category_id) FROM items)> 20
LIMIT (SELECT COUNT(category_id) FROM items) - 20
4

2 に答える 2

3

大きなテーブルがある場合、最も効率的な方法は、そのテーブルを再作成することです。

create table items_temp like items;
INSERT into items_temp (id, category_id, ... ) 
  SELECT id, category_id, ... from items orig
  WHERE id in (
     SELECT id from items items_select
     WHERE orig.category_id = items_select.category_id
     ORDER by category_id LIMIT 20
     );
RENAME table items to items_old, items_temp to items;

編集: TRUNCATE table items_old 削除しないでください-それは私たちが避けようとしていることです-削除は実際に各行を削除し、外部の制約に従います。これは非常に多くのCPUとIOを消費するものであり、切り捨てはこれを行いません.

そうしないと、削除フェーズ中にデータベースを停止する可能性が高くなります。少量のデータであれば問題ありません。

于 2012-10-30T05:57:31.570 に答える
3
DELETE FROM items 
WHERE (category_id,id) not in (
  SELECT category_id, id FROM items  a WHERE id IN (
     SELECT id FROM items s 
     WHERE a.category_id = s.category_id
     ORDER BY category_id LIMIT 20) 
  ORDER BY  id)
于 2012-10-30T05:42:03.297 に答える