在here有一个类似的问题,但是这个问题看起来太旧了,因为答案是在2009年提供的,只得到了7个支持。我相信有一个更好的策略。
表格如下:
id weight cost
1 1.2 0
2 2.5 0
3 2.9 0
...
其中重量和成本是物品的重量和成本。现在我想通过给出总成本N来更新每个id的成本。每个id的成本是总成本的一小部分,基于其相对于总重量的相对权重。
如上所述,只有三排表,总重量为1.2 + 2.5 + 2.9 = 6.6,因此,ID 1,2和3的成本为:
N*1.2/6.6
N*2.5/6.6
N*2.9/6.6
我有办法使用单个查询进行此更新吗?我试了一下,但它给了我错误信息SQLSTATE[HY000]: General error: 1111 Invalid use of group function
;这是我的代码,我想知道为什么不能这样做:
UPDATE `table`
SET `cost` = `cost` + :total_cost * `weight`/SUM(`weight`)
WHERE 1
答案 0 :(得分:1)
create table tbl1
(
id int auto_increment primary key,
weight decimal(10,4) not null,
cost decimal(10,4) not null
);
insert tbl1(weight,cost) values (1.2,0),(2.5,0),(2.9,0),(8.1,0),(1.1,0),(1.2,0);
-- assume total shipping cost (N) = 17.20
update tbl1 t1,
(select sum(weight) as tot_weight from tbl1) t2
set cost=17.20*(t1.weight/t2.tot_weight)
select * from tbl1;
select sum(cost) from tbl1;
-- 17.1999 (close enough :>)
答案 1 :(得分:0)
与陈述here一样,处理这种情况的典型方法是进行多表更新。您应该cross join到计算权重总和的子查询:
UPDATE
tableName tableNameToUpdate
CROSS JOIN
(SELECT
SUM(innerTableName.weight) AS sumWeight
FROM
tableName AS innerTableName
) tableNameSub
SET
tableNameToUpdate.cost = :total_cost *
(tableNameToUpdate.weight / tableNameSub.sumWeight)
实际上,如果要进行交叉连接,请使用交叉连接。 它比以下好多了:
from A, B