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

然后数据库应显示“Daz”数量为 1.0 KG。但是,我一直在做这件事。我试图做以下事情:

  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 的要求。

现在“最便宜”的方法是按我拥有的 Asc Price 对可用匹配进行排序。

不,我们可以看到第一行显示“compny1”以 5.00 英镑的价格出售 5 公斤……所以,我们需要 10 公斤,因此我们显示第 1 行。接下来,由于我们还没有满足 10 公斤的需求(仍然需要另外 5 公斤),我们看在第二行。我们看到“daz”卖 6KG。但是我们只需要再增加 5 公斤就可以满足 10 公斤的需求。因此,我希望做的是...更新表,以便将第一条记录复制到另一个表,并将第二行更新为剩余 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 回答