【问题标题】:Priority based order shortage in self referencing sql query自引用sql查询中基于优先级的订单短缺
【发布时间】:2016-07-11 05:32:59
【问题描述】:

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

这是我的疑问

这就是我想要实现的目标

谢谢。

【问题讨论】:

  • 有 SQLfiddle 吗?
  • 而且,鉴于 SQL 中的行表示无序集,您如何确定优先级?
  • 看起来优先级是先出先出?
  • 我按订单目标日期确定了优先级,抱歉我错过了该列。

标签: php mysql dynamic-queries


【解决方案1】:

内部查询按产品和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

【讨论】:

  • 太好了 :) 非常感谢。但这对我来说太先进了。你能告诉我它是什么,因为我只知道基本查询和子查询。是存储过程还是动态查询?所以我可以学习这个。
  • 它只是一个带有子查询的查询,子查询完成所有工作,外部查询只是呈现您想要的内部查询的位。 from 语句中的括号选择初始化了一些在子查询中使用的变量。您可以自行运行子查询以查看它正在执行的操作 - 关键是使用 '@RN 变量订购产品。
猜你喜欢
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 1970-01-01
  • 2013-09-09
  • 1970-01-01
相关资源
最近更新 更多