MySQL:如何为列的每个值保留前1000行

时间:2010-05-10 16:55:26

标签: mysql

我需要一些关于此查询的帮助:我想从表中删除以下行。 该表有4列:UserID,UserName,Tag,Score。

我希望每个代码只保留前1000名得分最高的用户。

所以我需要按分数排序,并保留每个标签的前1000个用户。

由于

3 个答案:

答案 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;

我没有用于创建临时表的语法,但这至少可以获得您想要的行。

小心删除命令...最好创建一个新的视图/表。