2016-07-11 23 views
0

私は高度なスキルを持っていない基本的な開発者です。 私はphp/mysqlで注文処理システムを持っており、SQLの優先順位に基づいて不足額を計算したいと考えています。現在私はこれのためにPHPの配列を使用しますが、私はこれをデータベース自体で実現したいと思います。ここで 自己参照SQLクエリの優先順位に基づく注文不足

は私が

enter image description here

を持っているクエリであり、これは私が

enter image description here

感謝を達成したいものです。

+0

SQLfiddleはありますか? – Strawberry

+0

そして、SQLの行が順序付けられていないセットを表す場合、どのように優先順位を設定しますか? – Strawberry

+0

優先順位は一番最初の注文ですか? –

答えて

0

内部クエリは、製品とオーダーIDで注文し、製品変更時に実行中の合計を計算します。

/* 
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 
+0

それは素晴らしいです:)ありがとう。しかし、それは私にとってはあまりにも進んでいます。基本的なクエリとサブクエリしか知っていないことを教えてください。それはストアドプロシージャか動的クエリですか?だから私はこれを学ぶことができます。 –

+0

サブクエリを持つ単なるクエリです。サブクエリは、外部クエリが必要とする内部クエリのビットを表示するだけで、すべての作業を行います。 fromステートメントの括弧で囲まれた選択は、副照会で使用されるいくつかの変数を初期化します。サブクエリを実行して、それが実行されていることを確認することができます。重要なことは、 '@RN変数を使用して製品を注文することです。 –

関連する問題