MySQL:如何将子项的 SUM() 值更新为同一表中的父行?

Posted

技术标签:

【中文标题】MySQL:如何将子项的 SUM() 值更新为同一表中的父行?【英文标题】:MySQL: How to update SUM() values of children to a parent row in the same table? 【发布时间】:2012-07-18 07:52:07 【问题描述】:

我需要获取子行的总和值并更新父行上的数据。 我得到了这个,如下所示,但遇到了错误 #1111(组函数的使用无效)。

CREATE TEMPORARY TABLE cms_ladu_temp LIKE cms_ladu;

INSERT INTO cms_ladu_temp SELECT * FROM cms_ladu WHERE parent_id IN (326,500);

UPDATE 
    cms_ladu 
INNER JOIN
    cms_ladu_temp
ON
    cms_ladu_temp.parent_id=cms_ladu.id 
SET  
    cms_ladu.child_packaging_units_in=SUM(cms_ladu_temp.packaging_units_in), 
    cms_ladu.child_net_weight_in=SUM(cms_ladu_temp.net_weight_in) 
WHERE 
    cms_ladu.id IN (326,500);

【问题讨论】:

【参考方案1】:

您需要做的是按 id 分组以分隔每个父 id 的子总和。您将需要使用子选择来完成此操作。

另外,您不需要创建临时表。只需将聚合包装在子选择中(按parent_id 分组),然后将子选择加入主表:

UPDATE 
    cms_ladu a
INNER JOIN
(
    SELECT   parent_id, 
             SUM(packaging_units_in) AS pui,
             SUM(net_weight_in) AS nwi
    FROM     cms_ladu
    WHERE    parent_id IN (326,500)
    GROUP BY parent_id
) b ON a.id = b.parent_id
SET 
    a.child_packaging_units_in = b.pui,
    a.child_net_weight_in = b.nwi

【讨论】:

请问,如何在 MS SQLSERVER 中执行此操作?它不接受这样的语法。【参考方案2】:

试试

UPDATE  cms_ladu a
    INNER JOIN (SELECT parent_id, SUM(packaging_units_in) AS packaging_units_in, SUM(net_weight_in) AS net_weight_in FROM cms_ladu_temp WHERE id IN (326,500) GROUP BY parent_id) b
        ON b.parent_id=a.id
SET     a.child_packaging_units_in = b.packaging_units_in
    ,a.child_net_weight_in = b.net_weight_in

【讨论】:

以上是关于MySQL:如何将子项的 SUM() 值更新为同一表中的父行?的主要内容,如果未能解决你的问题,请参考以下文章

如何将两行的值合并为同一个id的单行?

如何将带有子查询的 MySQL select 语句转换为同一张表的更新语句?

如何更新 Firebase DB 中子项的特定值

每次单击大纲视图行时,如何更新行值和子项

MYSQL怎么将表中的A字段值更新B字段值?求sql语句

mysql 批量更新与批量更新多条记录的不同值实现方法