2013-09-29 130 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