1

我希望以下查询会更新 where 的所有行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更新了所有行,这也应该有效。

4

1 回答 1

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

小提琴

于 2013-09-29T07:01:53.953 回答