我有表resources
,building
。我的问题应该解释我想要做的事情:
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'
我尝试了其他方式,例如使用加入或交换building
和resources
,但没有任何效果。我试过像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
答案 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);