Php 如何在MySQL中使用嵌套查询选择和插入,直到订购数量完成

Php 如何在MySQL中使用嵌套查询选择和插入,直到订购数量完成,php,mysql,nested-query,Php,Mysql,Nested Query,考虑到上面的图片,我想运行我的查询,直到满足$orderQty。在图中,上表是产品,下表是temp_salesee,这是运行我的代码后得到的结果。 这是我的密码: $orderQty = 22; $trID = round(microtime(true) * 1000); $proID = 1; $con->begin_transaction(); $stmt = $con->prepare(" INSERT INTO `temp_s

考虑到上面的图片,我想运行我的查询,直到满足$orderQty。在图中,上表是产品,下表是temp_salesee,这是运行我的代码后得到的结果。 这是我的密码:

    $orderQty = 22;
    $trID     = round(microtime(true) * 1000);
    $proID    = 1;

$con->begin_transaction();
$stmt = $con->prepare("
INSERT INTO `temp_salesee` (
    SELECT
         null,
         $trID,
        `pid`,
        `pur_price`,
        (CASE
                WHEN qty_avbl <= $orderQty THEN qty_avbl
                WHEN qty_avbl >= $orderQty THEN $orderQty
                else 0
            END),
        `batch_number`
        FROM `products`
        WHERE `pid` = ?
        ORDER BY `batch_number` ASC
)
        ");

$stmt->bind_param('s', $proID);
$stmt->execute();
$con->commit();
在temp_salesee中,第3行的数量应为2,以便总计数量将等于$orderQty,此时查询应停止,并且不应插入第4行和第5行。如果$orderQty小于产品表第一行中显示的qty_avbl,则仅应在数量为5的temp_salesee表中插入第一行。
非常坦白地说,我放弃了使用智能查询的想法,而使用普通的编程循环。完成。准备SELECT和INSERT语句句柄,开始事务,然后运行SELECT。然后,根据需要多次插入。最后,承诺


尽管也许有一个聪明的方法可以做到这一点,但它可能并不值得去寻找。而且,这可能不是显而易见的,这可能意味着,随着需求不可避免地。。。改变所以,我会说,减少你的损失。

< P>我希望并设想必须有一个更有效的解决方案,但是无论如何,考虑下面的:

模式MySQL v8.0

问题1

批号 产品标识 1. 1. 3. 1. 7. 1.
二十等于二?亲爱的@草莓20是第3行产品表中的数量平均值。虽然我只需要在第三行的temp_salesee表中保存2个,因为它将被加在15+5+2中,这将等于$orderQty,因此我将能够销售一个产品的22个项目,该产品有不同的批号。如果我的代码方法错误,请帮助我,然后向我提供您的loop?。谢谢这正是我以前告诉他们的。他们已经问了5次这个问题。您好,因为我是这个伟大网站的新手,但即使我遇到了一些问题,我也要感谢所有人,特别感谢@草莓,他以极大的热情解决了我的问题。他建议的编辑2代码对我来说100%工作正常。我的服务器版本5.7查询错误:错误:ER_PARSE_错误:您的SQL语法有错误;检查对应于您的MySQL服务器版本的手册,使用正确的语法,使用“BoTCHYL号”的“过订单”,在“产品2X批次X”上运行0行,参见上面的编辑2D,但是考虑UpgGad到8;这是从5.7向前迈出的相当大的一步。亲爱的@草莓,我感谢你的努力,但我很抱歉它不能满足我的要求。实际上,我正在开发一个Medical Store应用程序,在该应用程序中,我需要循环查询,该查询应该只插入那些SUMqty_avbl>=$orderQty的行。如产品表所示,前三行的SUMqty_avbl为40 15+5+20。现在,将qty=15的第一行插入temp_salesee表,然后将$orderQty be 22-15=7插入,然后将qty=5和$orderQty be 7-5=2插入第二行,第三行仅插入qty 2。请编辑我的代码或发送给我你的循环Q这里没有“循环”的必要我很高兴:你帮助我解决了我的问题。你在编辑2中建议的代码对我100%有效。在上面的代码中,我刚刚将balanceDROP TABLE IF EXISTS product_batches; CREATE TABLE product_batches (batch_number SERIAL PRIMARY KEY ,product_id INT NOT NULL ,quantity_available INT NOT NULL ); INSERT INTO product_batches VALUES ( 1,1,15), ( 3,1, 5), ( 7,1,20), (10,1,30), (11,1,50);
SELECT batch_number
     , product_id
  FROM 
     ( SELECT x.*
            , COALESCE(LAG(SUM(y.quantity_available),1) OVER (ORDER BY batch_number),0) running
         FROM product_batches x 
         JOIN product_batches y
           ON y.product_id = x.product_id 
          AND y.batch_number <= x.batch_number 
        GROUP 
           BY x.batch_number
      ) a 
  WHERE running <=22;