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
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 回答
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,truncate 不会这样做。

否则,您很可能会在删除阶段关闭您的数据库。如果是少量数据,没什么大不了的。

于 2012-10-30T05:57:31.570 回答