2010-05-10 30 views
1

我需要一些關於此查詢的幫助:我想從我的表中刪除以下行。 該表有4列:UserID,UserName,Tag,Score。MySQL:如何爲列的每個值保留前1000行

我只想保留每個標記的得分最高的前1000位用戶。

所以我需要按分數排序,並保留每個標籤的前1000個用戶。

感謝

回答

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); 

把空格,因爲我知道我必須做對甲骨文類似,不知道的MySQL將如何處理它沒有。

+0

嗨,感謝您的回覆。我得到這個錯誤:「這個版本的MySQL還不支持'LIMIT&IN/ALL/ANY/SOME子查詢'...我的MySQL版本是:5.0.77 – aneuryzm 2010-05-10 17:23:01

+0

你的答案在MySQL中不起作用,已經適應了SQL Server。謝謝 – aneuryzm 2010-05-11 10:11:30

-1

也許一個臨時表中,誰是充滿了SELECT子句

SELECT * FROM table ORDER BY Score DESC LIMIT 1000; 

我沒有語法得心應手創建臨時表,但將ATLEAST得到你想要的行。

小心刪除命令......最好創建一個新的視圖/表格。

+0

我認爲他想要不同的東西。爲每個標籤保留1000個最高得分用戶。您的選擇只會得到總計1000位得分最高的用戶。 – 2010-05-10 17:05:51

+0

哦,你是對的,我沒有看到「每個標籤」。在這裏最好添加一個「GROUP BY Tag」。 – Karl 2010-05-10 17:08:49

+0

所以生成的查詢將是? – aneuryzm 2010-05-10 17:12:45

0

你應該可以通過子查詢解決這個問題,儘管我不完全確定MySQL是否支持刪除查詢。我知道,它可以給問題更新查詢(我已經因爲這個在MySQL一些段錯誤)

無論哪種方式...這應該工作(ATLEAST,它會在Postgres的)

DELETE FROM table WHERE id NOT IN (SELECT id FROM table ORDER BY Score DESC LIMIT 1000) 

假設id是你的主要關鍵。

解決方案使用臨時表:

請注意,您必須重複此過程爲每個標籤。我想不出在MySQL 5.0中的一個查詢中做到這一點的方法

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; 
+0

你也忘了「GROUP BY Tag」 – Karl 2010-05-10 17:09:33

+0

這個版本的MySQL還不支持'LIMIT&IN/ALL/ANY/SOME子查詢。我的MySQL版本是:5.0.77 – aneuryzm 2010-05-10 17:24:39

+0

@Karl:我認爲該表已經是唯一的每個用戶。如果不是,你是完全正確的課程:) @帕特里克:在這種情況下,我的查詢將不會工作。我看到的唯一清潔的替代方案是使用臨時桌子來完成繁重的工作。 – Wolph 2010-05-11 01:31:18

相關問題