用其他行的 SUM() 和 COUNT() 更新一行

Posted

技术标签:

【中文标题】用其他行的 SUM() 和 COUNT() 更新一行【英文标题】:UPDATE a row with the SUM() and COUNT() of other rows 【发布时间】:2013-01-17 12:17:48 【问题描述】:

想象两个表格,例如:

t1: id, sum, cnt 
t2: id, id_t1, value

我想做这样的查询;

UPDATE t1, t2 
   SET t1.sum = SUM(t2.value), 
       t1.cnt = COUNT(*) 
 WHERE t1.id = t2.id_t1;

查询应该使用t2 的值的总和更新t1.sum,其中t1.id=t2.id_t1t1.count 的行数为t1.id=t2.id_t1

但是失败并返回错误:ER_INVALID_GROUP_FUNC_USE: Invalid use of group function

我该怎么做?

【问题讨论】:

【参考方案1】:
UPDATE  t1 a
        LEFT JOIN 
        (
            SELECT  id_t1, 
                    SUM(value) totalSum,
                    COUNT(*) totalCount
            FROM    t2
            GROUP BY id_t1
        ) b ON   a.ID = b.id_t1
SET a.sum = COALESCE(b.totalSum, 0) ,
    a.cnt = COALESCE(b.totalCount, 0)
SQLFiddle Demo

【讨论】:

我在使用这个查询时遇到了很多死锁。我怎样才能避免它们? 死锁是什么意思?你能解释一下吗? 我正在使用与服务器的许多并发连接,并且前面的查询是同一张表上的 INSERT。我解决了强制对两个操作使用相同连接的死锁。如果你很好奇,这就是我遇到僵局的地方:piratenpad.org/p/KqIjkA4NUC

以上是关于用其他行的 SUM() 和 COUNT() 更新一行的主要内容,如果未能解决你的问题,请参考以下文章

聚合函数&count&sum&avg&max&min

SQL sum和count的连接关系

mysql中sum()和count()的使用

MySQL基础教程---常见函数介绍

数据库中Count是啥意思和SUM有啥区别

MySQL聚合函数