mysql中的双循环,具有复杂的更新
你好,堆栈溢出的聪明头脑 今天,我花了4个小时尝试生成一个更新命令,该命令可以避免我必须用150行(每行3列)填充一个表 为此,我创建了以下更新命令:mysql中的双循环,具有复杂的更新,mysql,loops,Mysql,Loops,你好,堆栈溢出的聪明头脑 今天,我花了4个小时尝试生成一个更新命令,该命令可以避免我必须用150行(每行3列)填充一个表 为此,我创建了以下更新命令: UPDATE storage SET Quantity = (SELECT SUM(delivery_data.Quantity) FROM delivery_data, delivery, product WHERE delivery_data.ID_Delivery = delivery.ID AND delivery.ID_Store
UPDATE storage SET Quantity =
(SELECT SUM(delivery_data.Quantity) FROM delivery_data, delivery, product
WHERE delivery_data.ID_Delivery = delivery.ID AND delivery.ID_Store = storage.ID_Store AND
storage.ID_Store = 5 AND delivery_data.ID_Product = product.ID AND product.ID = 1)
- IFNULL((SELECT SUM(purchase.Quantity) FROM purchase, sale, employee, product
WHERE purchase.ID_Sale = sale.ID AND sale.ID_employee = employee.NIF
AND employee.ID_Store = storage.ID_Store AND storage.ID_Store = 5
AND purchase.ID_Product = product.ID AND product.ID = 1), 0) WHERE storage.ID_Store = 5
AND storage.ID_Product = 1;
^很抱歉,代码没有吸引力,但这是一个很长的更新命令,我不知道最好的方法
不管怎么说,如果你认为这是相关的,下面是发生在那里的事情:
我有大量的表格,这些表格创建了一个公司的交付和购买(交付是公司购买的产品,购买是客户购买的产品),我想存储每个商店有多少存货(公司有几个商店),通过计算该产品有多少已交付到该商店,减去该商店的销售额
上面的命令工作正常,但是您可能知道它只适用于store 5和product 1,要使它适用于所有5个store和30个product,我必须复制并粘贴它150次,然后更改值
(尽管这样做很可能比试图在MySQL中创建双循环要快,但总的来说,如果我学会了这种方法,这可能是最好的。)
是的,为了解决这个问题,我从网上找到的循环片段中写了一个双循环,因为我并不完全知道它们是如何工作的。这是给我带来麻烦的代码:
DELIMITER $$
CREATE PROCEDURE update_storage()
BEGIN
DECLARE x INT Default 1;
DECLARE y INT Default 1;
store: LOOP
product: LOOP
UPDATE storage SET Quantity = (SELECT DISTINCT delivery_data.Quantity FROM delivery_data, delivery, product WHERE delivery_data.ID_Delivery = delivery.ID AND delivery.ID_Store = storage.ID_Store AND storage.ID_Store = 5 AND delivery_data.ID_Product = product.ID AND product.ID = 1) - IFNULL((SELECT DISTINCT purchase.Quantity FROM purchase, venda, employee, product WHERE purchase.ID_Venda = venda.ID AND venda.ID_employee = employee.NIF AND employee.ID_Store = storage.ID_Store AND storage.ID_Store = 5 AND purchase.ID_Product = product.ID AND product.ID = 1), 0) WHERE storage.ID_Store = 5 AND storage.ID_Product = 1;
SET y = y + 1;
IF y = 31 THEN
LEAVE product;
END IF;
ITERATE product;
END LOOP product;
SET x = x + 1;
IF x = 6 THEN
LEAVE store;
END IF;
ITERATE store;
END LOOP store;
END $$
DELIMITER ;
从我测试的情况来看,它似乎适用于Store1上的30种产品,然后它就卡住了,我必须重新启动MySQL控制台。如果我将X值更改为默认值2,3,等等,那么它可以工作,这样我只需要手动运行1个循环5次,但正如我之前所说的,了解如何进行双循环会更有教育意义
TL;DR是什么让我上面的双循环在第一次运行y变量后停止工作?我是个十足的白痴吗?双循环在mysql中是不可能的吗?非常感谢您的帮助。经过一番搜索,我找到了答案:我没有重置“y”变量,所以它总是在第一次存储后31点开始。如果有人想了解如何进行双循环,下面是一般语法:
DELIMITER $$ --basically means what character(s) are used to finalize a command, which is ; by default
CREATE PROCEDURE whateveryouwanttonamethis()
BEGIN
DECLARE x INT Default 1;
DECLARE y INT;
LOOP1: LOOP
SET y = 1;
LOOP2: LOOP
--What you whish to do with the loop, using X and Y as if they were fields of a table containing values
SET y = y + 1;
IF y = 999 THEN --replace 999 with the amount of times you want the inner loop to run for
LEAVE LOOP2;
END IF;
ITERATE LOOP2;
END LOOP LOOP2;
SET x = x + 1;
IF x = 999 THEN --replace 999 with the amount of times you want the outter loop to run for
LEAVE LOOP1;
END IF;
ITERATE LOOP1;
END LOOP LOOP1;
END $$
DELIMITER ;
在子查询中使用DISTINCT对我来说似乎很奇怪。对于给定的
(ID\u商店,ID\u产品)
,似乎会有多个交付。考虑到delivery
和delivery\u data
,,,,之间的关系看起来像是一对多的关系,获取不同值的列表似乎并不正确。我知道问题是关于循环中的循环,但是我被UPDATE语句卡住了,它看起来是错误的。@spencer7593哦,是的,你是对的。老实说,更新命令中有太多东西,我很难知道自己在做什么:P@spencer7593我想已经修好了。