我遇到了MySQL UPDATE查询的问题,而这种查询没有按照我想要的方式进行。
我有3张桌子,它们看起来像这样(仅限相关部分):
[inventory table]
id
population
[item table]
id
populationGeneration
[items_for_inventory table]
id
inventory_id
item_id
amount
我想要完成的是以下内容。 库存具有ID和人口计数列。人口是一个需要改变而不是被覆盖的价值。
项目包含id和生成计数列。这意味着对于具有此ID的每个项目,这是它生成的人口数量,应该添加到Inventory.population。
最后是一个链接表,其中包含广告资源的ID和商品的ID,并且最后是该商品的数量。
一个简单的例子 库存人口= 5000
第1项populationGeneration = 1
第2项populationGeneration = 3
items_for_inventory通过id将项目链接到库存,并指定库存包含例如20件商品1和3件商品2.所以:
items_for_inventory id 1,金额 20
items_for_inventory id 2,金额 3
当我运行所需的脚本时,我希望将包含populationGeneration的所有项目添加到初始填充中,这意味着:
库存人口= 5029 (20x1和3x3)。
我试过的脚本不起作用(我尝试了很多):
UPDATE inventory ivt,
(SELECT
tmp.inventory_id,
tmp.amount * tmp.populationGeneration AS population
FROM (SELECT ifi.id AS ifi_id,
inventory_id,
item_id,
amount,
populationGeneration
FROM items_for_inventory ifi
JOIN item itm ON ifi.item_id = itm.id) tmp
) AS tmps
SET ivt.population = tmps.population
WHERE ivt.id = tmps.inventory_id AND itm.id = tmps.item_id;
答案 0 :(得分:1)
如果我理解正确,您需要在执行分配之前汇总到库存级别。当多行与更新匹配时,将选择一个任意匹配的行进行更新。他们没有积累。
幸运的是,这很容易解决:
UPDATE inventory ivt JOIN
(SELECT ifi.inventory_id,
sum(ifi.amount * itm.populationGeneration) AS population
FROM items_for_inventory ifi JOIN
item itm
ON ifi.item_id = itm.id
GROUP BY ifi.inventory_id
) newp
ON ivt.id = newp.inventory_id
SET ivt.population = newp.population ;