如何使用一个查询基于相对值更新表列

时间:2015-07-20 03:59:00

标签: mysql sql pdo sql-update

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

2 个答案:

答案 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