Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL通过table1更新table1+;表2然后将表2设置为0_Mysql - Fatal编程技术网

MySQL通过table1更新table1+;表2然后将表2设置为0

MySQL通过table1更新table1+;表2然后将表2设置为0,mysql,Mysql,我有表资源,建筑。我的问题应该解释我试图做什么: 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' 我尝试过其他方法,比如使用join或swapbui

我有表
资源
建筑
。我的问题应该解释我试图做什么:

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'
我尝试过其他方法,比如使用join或swap
building
resources
,但没有任何效果。我尝试了类似
r.wood=r.wood+(选择sum(storage)等)
的方法,但由于某些原因,这不起作用。此外,我无法比较别名(至少对于我尝试过的情况)

什么不起作用?有两栋建筑名为
wood\u farm
。它们通过
castle\u id
链接到资源。假设两栋建筑的存储空间为5。这个查询将使资源等于5,而不是我想要的10(5存储+5存储)。现在,两栋农场建筑的存储量将等于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
我尝试了以下方法(添加另一个子选择项,该子选择项生成存储的总和):

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

输出:

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);

你能提供示例数据集和表定义吗?@MKhalidJunaid我不想听起来很愚蠢,但我希望我的编辑是你想要的。我不是sql爱好者。如果您还提供表的示例数据,那就更好了。使用提供模式和数据详细信息并在表中添加链接是一个好主意post@MKhalidJunaid我做了这篇文章,并不是每一篇专栏文章,因为我不认为这是必要的,特别是因为我刚开始这个游戏,但是默认值,它的组织方式等都完全相同。@Hybrilynx我添加了另一个更新版本,使用sum和group by(在您将示例数据发布到sqlfiddle中之后),我使用mysql版本进行了编辑。因为(选择总和(存储)等)不起作用。您的第一个答案似乎在我的phpmyadmin中有语法错误。虽然我一直在尝试选择第二个版本b2,但我也无法让它工作。也许对于你的答案,它们是警告,但我确实执行了我上面的示例,使用类似
wood=wood+(选择sum(etc))
的方法,但失败了。但不管怎样,我得到了你的答案,或者说你的风格。我之所以说样式,是因为它导致了将建筑大写的错误。我在phpmyadmin中得到的警告,即使代码仍然有效,也总共是6条,以
一个表达式开始,该表达式应该在附近(
意外标记在附近)(
,以及其他4个,我不能只是复制/粘贴。但即使它们是警告,我现在确实有一个代码可以工作,我在我的数据库上测试了它。在php中进行双重检查。我使用大写字母,但您可以根据自己的喜好进行更改。
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);