MYSQL 更新使用 sum() 结果跨多个表

Posted

技术标签:

【中文标题】MYSQL 更新使用 sum() 结果跨多个表【英文标题】:MYSQL Update using sum() result across multiple tables 【发布时间】:2013-01-06 08:40:17 【问题描述】:

这个位很好用:

 SELECT products_id, sum(attributes_stock) 
 FROM products_attributes 
 GROUP BY products_id

这会将attributes_stock 列中的所有字段组加在一起。

我遇到的问题是让这个结果更新另一个表中的另一个列。

这就是我所拥有的:

 UPDATE products, products_attributes 
 SET products.products_quantity = sum(products_attributes.attributes_stock) GROUP BY products_attributes.products_id 
 WHERE products.products_id = products_attributes.products_id

非常感谢任何建议。

【问题讨论】:

【参考方案1】:

您不能在更新语句中使用group by。您需要使用子选择来进行分组。

类似这样的:

UPDATE products p,( SELECT products_id, sum(attributes_stock)  as mysum
                   FROM products_attributes GROUP BY products_id) as s

   SET p.products_quantity = s.mysum
  WHERE p.products_id = s.products_id

【讨论】:

优秀的答案【参考方案2】:

试试这个:

update 
    products, 
    (select 
        products_id, sum(attributes_stock) as sumAttr
     from products_attributes
     group by products_id) as a
set
    products.products_cuantity = a.sumAttr
where
    products.products_id = a.products_id

【讨论】:

【参考方案3】:

有些人喜欢使用更新样式的 JOIN ... ONsyntax 进行连接操作,而不是逗号运算符和 WHERE 子句中的连接谓词:

UPDATE products p
  JOIN ( SELECT q.products_id
              , SUM(q.attributes_stock) AS sum_attr
           FROM products_attributes q
          GROUP BY q.products_id
       ) r
    ON r.products_id = p.products_id
   SET p.products_quantity = r.sum_attr

【讨论】:

...如果您不想更新表中的每一行,请不要忘记“where”子句。 我还应该补充一点——“JOIN ... ON”语法实际上可以提高连接 3 个或更多表时的查询性能。 JOIN 语法的另一个优点是,如果您还想更新根本没有库存的产品(设置quantity=0),您可以轻松地将连接更改为LEFT JOIN

以上是关于MYSQL 更新使用 sum() 结果跨多个表的主要内容,如果未能解决你的问题,请参考以下文章

Mysql全文搜索跨多个表的相关性

多个mysql表列的Sum,Subtract和Join

mysql sum() 和双重结果使用多个连接

使用 LEFT JOIN 更新 MySQL 中的多个表

SUM GROUP BY与多个表上的子查询

跨多个表优化mysql查询