MySQL仅从第一行而不是所有行更新a

时间:2015-01-22 11:38:23

标签: mysql

我遇到了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;

1 个答案:

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