【问题标题】:MySql UPDATE with SUM in same tableMySql UPDATE 与 SUM 在同一张表中
【发布时间】:2013-02-21 22:42:08
【问题描述】:

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

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

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

【问题讨论】:

    标签: mysql sql sum


    【解决方案1】:
    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) 上的索引将有助于有效地计算派生表和自联接。

    【讨论】:

    • 给你们的问题...我在一个有大约 400K 行的表上运行它,它正在崩溃(可能内存不足)。有什么建议可以解决吗?比如,一种分块运行查询的方法?
    • 这可能看起来“复杂”,但实际上很容易实现并且工作起来就像一个梦想(你需要一个唯一的索引,我必须根据我的要求创建一个)
    • 可爱。非常感谢
    【解决方案2】:

    你快到了。

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

    这应该可行

    【讨论】:

    • 它不会在 MySQL 服务器上运行。 stackoverflow.com/questions/653826/update-with-sum-in-mysql
    • 返回Error Code: 1093. You can't specify target table 'r' for update in FROM clause
    • 哇,为我的案子工作。那些说它不起作用的人,请您更改它以适合您的情况!
    • 之所以有效是因为在子查询中使用了results r2
    猜你喜欢
    • 2015-09-02
    • 2012-05-08
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 2021-12-21
    相关资源
    最近更新 更多