2

SQLデータベースを持っていますが、要求された顧客の数量が満たされるまでレコードを取得したいと考えています。これが私の言いたいことです。リクエストテーブル

Product     Quantity   Price
-----------------------
Apple          10.0      5.00 

一致を取得するためのSQLクエリは次のとおりです。

SELECT c.FName,
       p.ProductName,
       s.Description, 
       s.Quantity, 
       s.Price 
FROM requests r
    INNER JOIN sellers s 
        ON r.ProductID = s.ProductID
   INNER JOIN products p 
        ON p.ProductID=s.ProductID 
   INNER JOIN customers c 
        ON c.ID=s.C_ID       
WHERE r.C_ID = 3 AND r.matchType='Price'
ORDER BY s.Price ASC 

そしてここに結果があります:

     FName   |   ProductName    |     Description                 |  Quantity  |   Price
    --------------------------------------------------------------------------=
 compny1          Apple                    royal apples fm appleco.      5.0          5.00
    daz            Apple                     sweet apples                6.0          5.50
company2         Apple                       Apples yum                   8.0          9.00 

行を選択してデータベースを更新することにより、要求された10KGの完全な数量を表示したいのですが、出力は次のようになります。

apples @5kg from compny1 = 5.00
apples @5kg from daz = 5.50
total = 10.50

データベースには、残り1.0KGの「Daz」数量が表示されます。しかし、私はこれをすることに夢中になり続けます。私は次のことを試みました:

  while ($rows1 = mysql_fetch_assoc($queryQuantity2)){

        if($rows1['Quantity']==$quantityRequested){ //If the first row = 10KG output only this row.
echo $rows1['FName'];
echo $rows1['NameProduct'];
echo $rows1['Quantity'];
echo $rows1['Price'];
}else{
//stuck here check the next rows and see there is 6KG's .. We need 10KG Requested - 5KG from daz(row1) 
//                                                                            -Remaining amount left(i.e.5KG)
//hence, print the output specified above and UPDATE Database where quantity has been reduced by X amount.
}

さて、問題は何ですか。10KGの要求された需要を「補う」必要があります。

これを行うための「最も安い」方法は、利用可能な一致を私が持っているAscPriceでソートすることです。

いいえ、最初の行は「compny1」が5KGを£5.00で販売していることを示しています...したがって、10KGが必要なので、行1を表示します。次に、10KGの需要をまだ満たしていないため(さらに5KGが必要)、 2行目。'daz'は6KGを販売していることがわかります。しかし、10KGの需要を満たすために必要なKGはあと5つだけです。したがって、私がやりたいのは...テーブルを更新して、最初のレコードが別のテーブルにコピーされ、2番目の行が残り1.0kg(6KG-5KG)に更新されるようにします。したがって、顧客に表示する:あなたの10KGはによって購入することができます

compny1 5KG@5.00
daz 5KG@5.50
------ 
Total £10.50

だから、それが私の問題です。要求された数量に達するまで行をチェックし続ける方法がわかりません。「これまでに」追加された量を追跡し、次の行からどれだけ多くが必要かを確認する、ある種の「カウンター」が必要だと思います。

4

1 に答える 1

0

これの単純化されたバージョンがあるかもしれませんが、これはかなり近いはずです:

Select FName, 
  IF(summedQty>10,Quantity-(summedQty-10),Quantity) Quantity,
  Price
From (
  Select 
    FName, 
    Quantity, 
    Price,
    @qtySum:=IF(@qtySum>10,10000,@qtySum+Quantity) summedQty
  From Results
    Join (Select @qtySum:=0) t
  Order By Price
  ) t
Where summedQty != 10000

私は 10000 を任意の値として使用しました。これは決してヒットしないことがわかっています。潜在的な値よりも大きいことを確認してください。そして、私が 10 を使用したところはどこでも、最大値に置き換える必要があります。

SQL フィドルのデモ

任意の値をそのまま使用したくない場合は、これも同様に機能するようです。

Select FName, 
  IF(summedQty>10,Quantity-(summedQty-10),Quantity) Quantity,
  Price
From (
  Select 
    FName, 
    Quantity, 
    Price,
    @qtySum:=@qtySum+Quantity summedQty
  From Results
    Join (Select @qtySum:=0) t
  Order By Price
  ) t
Where IF(summedQty>10,Quantity-(summedQty-10),Quantity) > 0

SQL フィドルのデモ

私が言ったように、バリエーションがあると確信していますが、これは正しい方向に進むはずです.

于 2013-03-03T00:23:54.543 に答える