php - 自引用 SQL 查询中基于优先级的订单短缺

标签 php mysql dynamic-queries

我是一名基础开发人员,没有高级技能。 我有一个 php/mysql 订单处理系统,想根据 SQL 中的优先级计算短缺情况。目前我使用 php 数组来实现此目的,但我想在数据库本身中实现此目的。

这是我的疑问

enter image description here

这就是我想要实现的目标

enter image description here

谢谢。

最佳答案

内部查询按产品和 orderid 排序,并计算产品更改时的运行总计重置。

/*
drop table orders;

create table orders (orderid varchar(6),productid varchar(10),reqqty int);

create table stock (productid varchar(6), stock int);

truncate table orders;
insert into orders values
('OR250','A45',100),('OR250','A55',200),('OR250','A65',400),
('OR260','A45',150),('OR260','A55',25),
('OR270','A55',100),('OR270','A65',50),('OR270','B15',500)
;

TRUNCATE TABLE STOCK;
INSERT INTO STOCK VALUES
('A45',200),('A55',250),('A65',180),('A75',300),('A85',400),('A95',780),('B15',150),('B25',225);
*/

SELECT  T.ORDERID,T.PRODUCTID,T.REQQTY,T.SHORTAGE,T.STOCKREMAINING AS STOCK
FROM
(
SELECT  @RN:=IF (O.PRODUCTID  <> @PRV,1,@RN+1) RN,
            O.ORDERID,O.PRODUCTID,O.REQQTY
            ,S.PRODUCTID AS SPRODUCTID,S.STOCK
            ,@PRV:=O.PRODUCTID PREVPROD
            ,@RT:=IF(@RT=0 OR @RN = 1,S.STOCK-O.REQQTY,@RT - O.REQQTY)  RT
            ,CASE WHEN @RT < 0 THEN @RT * -1 ELSE 0 END AS SHORTAGE
            ,CASE WHEN @RT >= 0 THEN @RT ELSE 0 END AS STOCKREMAINING
FROM    (SELECT @RN:=0) RN,(SELECT @PRV:='') PRV,(SELECT @RT:=0) RT,ORDERS O
JOIN  STOCK  S ON S.PRODUCTID = O.PRODUCTID
) T
ORDER   BY  T.ORDERID,T.PRODUCTID

关于php - 自引用 SQL 查询中基于优先级的订单短缺,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38299752/

相关文章:

php - 使用 Laravel 对 JSON 字段进行不区分大小写的查询

php - 我如何使用 wp_list_pages 将值 ="1"添加到当前 li

php - 分发文件使收件人无法阅读

mysql - 如何从不包括第二个表Mysql的数据的表中选择数据?

mysql - 在不同的数据库上运行 MySQL 查询

sql - 考虑到动态查询的索引大平面表的最佳方式

php - 在 PHP 应用程序中保持数据库凭据的安全

python - Django/mySQL - 属性错误 : 'ForeignKey' object has no attribute 'IntegerField'

mysql - 使用sql从xml中提取值

php - 带有准备语句的 PDO 动态查询