Php 如何在MySQL中使用嵌套查询选择和插入,直到订购数量完成
考虑到上面的图片,我想运行我的查询,直到满足$orderQty。在图中,上表是产品,下表是temp_salesee,这是运行我的代码后得到的结果。 这是我的密码: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 = 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%有效。在上面的代码中,我刚刚将balance
DROP 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;