Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.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中的双循环,具有复杂的更新_Mysql_Loops - Fatal编程技术网

mysql中的双循环,具有复杂的更新

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

你好,堆栈溢出的聪明头脑

今天,我花了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 = 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我想已经修好了。