我需要一些關於此查詢的幫助:我想從我的表中刪除以下行。 該表有4列:UserID,UserName,Tag,Score。MySQL:如何爲列的每個值保留前1000行
我只想保留每個標記的得分最高的前1000位用戶。
所以我需要按分數排序,並保留每個標籤的前1000個用戶。
感謝
我需要一些關於此查詢的幫助:我想從我的表中刪除以下行。 該表有4列:UserID,UserName,Tag,Score。MySQL:如何爲列的每個值保留前1000行
我只想保留每個標記的得分最高的前1000位用戶。
所以我需要按分數排序,並保留每個標籤的前1000個用戶。
感謝
基於對方的回答,
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將如何處理它沒有。
也許一個臨時表中,誰是充滿了SELECT子句
SELECT * FROM table ORDER BY Score DESC LIMIT 1000;
我沒有語法得心應手創建臨時表,但將ATLEAST得到你想要的行。
小心刪除命令......最好創建一個新的視圖/表格。
你應該可以通過子查詢解決這個問題,儘管我不完全確定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;
嗨,感謝您的回覆。我得到這個錯誤:「這個版本的MySQL還不支持'LIMIT&IN/ALL/ANY/SOME子查詢'...我的MySQL版本是:5.0.77 – aneuryzm 2010-05-10 17:23:01
你的答案在MySQL中不起作用,已經適應了SQL Server。謝謝 – aneuryzm 2010-05-11 10:11:30