MySQL更新table1由table1 + table2然后将table2设置为0

时间:2017-09-25 06:33:14

标签: mysql

我有表resourcesbuilding。我的问题应该解释我想要做的事情:

update building b, resources r
        set
            r.wood = r.wood + b.storage,
            b.storage = 0
        where
            b.castle_id = r.castle_id and
            b.name = 'wood_farm'

我尝试了其他方式,例如使用加入或交换buildingresources,但没有任何效果。我试过像r.wood = r.wood + (select sum(storage) etc)这样的东西,但由于某种原因它不起作用。此外,我无法比较别名(至少我试过的)。

什么不起作用?有2栋名为wood_farm的建筑物。它们通过castle_id与资源相关联。可以说2座建筑有storage = 5。此查询将使资源等于5而不是我想要的10(5个存储+5个存储)。现在两个wood_farm建筑物存储将等于0。

我能理解为什么这不起作用,但我无法找到解决方案。

building  | id, castle_id, name, storage, etc, speed, etc, deleted, etc
resources | id, castle_id, wood, stone, etc, etc, deleted, etc
castle    | id, other stuff, etc

MySQL版

innodb_version 5.6.34
protocol_version 10
version 5.6.34-log
version_comment Source distribution
version_compile_machine x86_64
version_compile_os Linux

1 个答案:

答案 0 :(得分:1)

我尝试了这个(添加另一个制作存储总和的子选择):

    UPDATE building b, resources r
          , (SELECT CASTLE_ID, NAME, SUM(STORAGE) AS STORAGE FROM building GROUP BY CASTLE_ID, NAME) b2
          SET r.wood = r.wood+b2.storage, b.storage=0
    WHERE b.castle_id = r.castle_id AND b.name = 'wood_farm'
           AND b2.castle_id=r.castle_id AND b2.name=b.name
     ;

他根据要求进行了更新。但我认为你应该做一些检查,以确保它总是这样做。

输出:

ID  CASTLE_ID   NAME    STORAGE
1   2   wood_farm   0
1   3   iron_farm   10

ID  CASTLE_ID   WOOD
1   2   19
1   3   6

示例数据:

CREATE TABLE BUILDING (ID INT, CASTLE_ID INT, NAME VARCHAR(20), STORAGE INT);
CREATE TABLE RESOURCES (ID INT, CASTLE_ID INT,  WOOD INT);
INSERT INTO BUILDING VALUES (1, 2, 'wood_farm', 10);
INSERT INTO BUILDING VALUES (1, 3, 'iron_farm', 10);
INSERT INTO BUILDING VALUES (1, 2, 'wood_farm', 4);
INSERT INTO RESOURCES VALUES (1, 2, 5);
INSERT INTO RESOURCES VALUES (1, 3, 6);