我需要一些关于此查询的帮助:我想从表中删除以下行。 该表有4列:UserID,UserName,Tag,Score。
我希望每个代码只保留前1000名得分最高的用户。
所以我需要按分数排序,并保留每个标签的前1000个用户。
由于
答案 0 :(得分:0)
根据其他答案,
DELETE FROM table t1
WHERE UserID NOT IN (SELECT userID FROM table t2
WHERE t2.tag = t1.tag
ORDER BY Score DESC LIMIT 1000);
这假定UserID
是唯一/主键字段。如果不是,你可以这样做:
DELETE FROM table t1
WHERE UserID||' '||Tag NOT IN (SELECT UserID||' '||Tag FROM table t2
WHERE t2.tag = t1.tag
ORDER BY Score DESC LIMIT 1000);
放入空格,因为我知道我必须在Oracle上做类似的事情,不确定MySQL如何在没有它的情况下处理它。
答案 1 :(得分:0)
你应该能够用子查询解决这个问题,虽然我不完全确定MySQL是否支持删除查询。我知道它可以给出更新查询的问题(因为这个我在MySQL中有一些段错误)
无论哪种方式......这应该有效(至少,它会在Postgres中)
DELETE FROM table WHERE id NOT IN (SELECT id FROM table ORDER BY Score DESC LIMIT 1000)
假设id
是你的主要关键词。
使用临时表的解决方案:
请注意,您必须为每个标记重复此过程。我无法想到在MySQL 5.0中的1个查询中实现它的方法
CREATE TEMPORARY TABLE top_users
SELECT * FROM table
WHERE Tag = ...
GROUP BY UserID
ORDER BY Score DESC
LIMIT 1000;
DELETE FROM table WHERE Tag = ...;
INSERT INTO table
SELECT * FROM top_users;
答案 2 :(得分:-1)
也许是一个临时表,其中填充了一个select子句
SELECT * FROM table ORDER BY Score DESC LIMIT 1000;
我没有用于创建临时表的语法,但这至少可以获得您想要的行。
小心删除命令...最好创建一个新的视图/表。