2010-09-01 51 views
0

首先,爲可怕的標題道歉,我想不出一個更好的方式來表達我的問題。 (隨意建議更好的替換)MySQL更新 - 選擇性更新

基本上我有一個「計數」列的表。 我想將所有計數重置爲零,除了具有最高值的10行外。我希望它們重置爲0.

如何在不編寫多個查詢的情況下實現此目的?

更新 我有我的查詢作爲現在以下

UPDATE covers AS t1 
    LEFT JOIN (SELECT t.cover_id 
       FROM covers t 
       ORDER BY t.cover_views DESC 
       LIMIT 10) AS t2 ON t2.id = t.id 
    SET cover_views = 0 
    WHERE t2.id IS NULL 

我得到的錯誤#1054 - Unknown column 't2.id' in 'where clause' - 任何想法,爲什麼?

我也試過同樣的結果

UPDATE covers t1 
    LEFT JOIN (SELECT t.cover_id 
       FROM covers t 
       ORDER BY t.cover_views DESC 
       LIMIT 10) t2 ON t2.id = t.id 
    SET t1.cover_views = 0 
    WHERE t2.id IS NULL 
+0

是否有ID列或主鍵列? – MikeTWebb 2010-09-01 21:22:17

+0

是的,主鍵 – Chris 2010-09-01 21:25:46

+0

@Chris ...看起來像@Wadhi已經回答了。 – MikeTWebb 2010-09-01 21:27:06

回答

1

嘗試:

update <table> t 
left outer join 
(
select id from <table> order by <counter> desc limit 10 
) c on c.id = t.id 
set 
<counter> = 0 
where 
c.id is null; 
+0

這工作,謝謝! – Chris 2010-09-01 22:53:05

0

您可以使用子查詢如下:

update A set count = 0 where A.id not in 
(select id from A order by count desc limit 10) 
+0

MySQL錯誤1093 - 無法在FROM子句中爲更新指定目標表。欲瞭解更多信息,請參閱:http://stackoverflow.com/questions/3620940/deleting-a-row-based-on-the-max-value/3621005#3621005 – 2010-09-01 21:22:34

+0

@OMG小馬:感謝OMG小馬。你會如何糾正代碼? – 2010-09-01 21:25:56

+0

如果您在UPDATE和返回數據的子查詢之間放置子查詢,MySQL將接受它 - 在我提供的鏈接中有一個示例。 – 2010-09-01 21:28:19

2

用途:

UPDATE TABLE t1 
    LEFT JOIN (SELECT t.id 
       FROM TABLE t 
      ORDER BY t.id DESC 
       LIMIT 10) t2 ON t2.id = t1.id 
    SET TABLE.count = 0 
WHERE t2.id IS NULL 
+0

感謝這看起來很完美,無論如何,我可以將所有從連接表中設置爲1在同一個查詢或我必須做另一個? – Chris 2010-09-01 22:40:52

+0

我遇到了一個小問題,執行您的查詢 - 我更新了問題 - 請您看看嗎? – Chris 2010-09-01 22:49:52

+0

注意t.id desc limit 10的順序 - 你確實說過「我想將所有計數重置爲零,除了最高值的10行」,所以也許這應該是 desc limit order 10 – 2010-09-01 22:50:32