在同一个表中使用SUM的MySql UPDATE

时间:2013-02-21 22:42:08

标签: mysql sql sum

我正在使用具有以下结构的表(结果)(不要问,我没有构建它)

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

但这看起来并不正确,我担心我可能会走错路。

2 个答案:

答案 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';

这应该有效