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 ... ON
syntax 进行连接操作,而不是逗号运算符和 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() 结果跨多个表的主要内容,如果未能解决你的问题,请参考以下文章