我正在使用具有以下结构的表(结果)(不要问,我没有构建它)
id | record_type | user_id | answer_id | choice | score | total | email
-------------------------------------------------------------------------------
1 email xxxxxxx 0 userX@site.com
2 answer xxxxxxx aaaaaa A 0
3 answer xxxxxxx bbbbbb A 0
4 answer xxxxxxx cccccc B 10
5 email yyyyyyy 0 userY@site.com
6 answer yyyyyyy aaaaaa A 0
7 answer yyyyyyy bbbbbb A 0
8 answer yyyyyyy cccccc A 0
9 email zzzzzzz 0 userZ@site.com
10 answer zzzzzzz aaaaaa A 0
11 answer zzzzzzz bbbbbb A 0
12 answer zzzzzzz cccccc B 10
这是一项调查,在提交调查结果后,正确答案的得分值发生了变化。我已经运行了更新,将“正确”答案的分数值设置为10,现在我需要使用record_type:email更新行的总数,以便我们联系获奖者。
目标是将行1,5和9的总列设置为10,0和10
我在考虑这样的事情
UPDATE results SET total = SUM(score)
FROM results GROUP BY user_id WHERE user_id = user_id
但这看起来并不正确,我担心我可能会走错路。
答案 0 :(得分:9)
UPDATE
results AS r
JOIN
( SELECT user_id,
SUM(score) AS sum_score
FROM results
WHERE record_type = 'answer'
GROUP BY user_id
) AS grp
ON
grp.user_id = r.user_id
SET
r.total = grp.sum_score
WHERE
r.record_type = 'email';
关于效率,(record_type, user_id, score)
上的索引有助于有效地计算派生表和自联接。
答案 1 :(得分:3)
你快到了。
UPDATE results r SET total =
(select SUM(score) FROM results r2
WHERE r2.user_id = r.user_id
and r2.record_type = 'answer')
where r.record_type = 'email';
这应该有效