2013-09-29 128 views
1

我希望以下查詢將更新所有行,其中updated=0,但它不。它只做一次更新。你能明白爲什麼嗎?爲什麼不更新所有行時應更新所有行?

UPDATE scores t1 
JOIN scores t2 
ON FIND_IN_SET(t1.id, t2.vals) 
SET t1.total = t1.total + 1 
WHERE t2.updated = 0; 

表運行的查詢

"id" "total" "vals" "updated" 
"1"  "0"  ""  "0" 
"2"  "0"  ""  "0" 
"3"  "0"  ""  "0" 
"4"  "0"  "1,2,3" "0" 
"5"  "0"  "1,2" "0" 

期望的結果

"id" "total" "vals" "updated" 
"1"  "2"  ""  "0" 
"2"  "2"  ""  "0" 
"3"  "1"  ""  "0" 
"4"  "0"  "1,2,3" "0" 
"5"  "0"  "1,2" "0" 

之前什麼我越來越

"id" "total" "vals" "updated" 
"1"  "1"  ""  "0" 
"2"  "1"  ""  "0" 
"3"  "1"  ""  "0" 
"4"  "0"  "1,2,3" "0" 
"5"  "0"  "1,2" "0" 

由於update scores set totals = 1 where updated = 0更新了所有行,所以這也應該起作用。

+1

它只更新匹配'ON'條件的行。 – Barmar

+0

@Barmar我已經用結果更新了我的問題。它只更新一次在我的情況下,採取'4' – jmenezes

回答

3

UPDATE只是更新符合條件的每一行,每次匹配連接表中的不同行時,它不會執行SET子句。您可以使用此查詢來計算匹配數量,然後按該數量遞增。

UPDATE scores t1 
JOIN (
    SELECT t1.id id, COUNT(*) matches 
    FROM scores t1 
    JOIN scores t2 
    ON FIND_IN_SET(t1.id, t2.vals) 
    WHERE t2.updated = 0 
    GROUP BY id) t2 
ON t1.id = t2.id 
SET total = total + matches, 
    updated = 1 

FIDDLE

+0

行很好地工作。一個小小的補充:如果我需要設置updated = 1,其中行屬於包含vals的行(在這種情況下爲4和5,所以當這個查詢再次運行時它們不會被再次選擇),可以在同一個語句中完成,或者它需要分開完成。 – jmenezes

+0

您可以根據需要設置任意數量的列。我已經更新了答案。 – Barmar

+0

實際上,我的意思是在這種情況下只將4和5設置爲1.爲更新而選擇的行。我將以不同的方式使用此解決方案。感謝您的幫助。 – jmenezes