2017-04-03 54 views
3

有此表如何選擇,直到總和達到一定值

#table stock 
+-------+----------+ 
| id | stock | 
+-------+----------+ 
| 1 | 20 | 
+-------+----------+ 
| 2 | 25 | 
+-------+----------+ 
| 3 | 10 | 
+-------+----------+ 
| 4 | 20 | 
+-------+----------+ 
#note: this is an arbitrary random data 

我怎能選擇行從表中,直到料柱的sum()達到一定值或高一點和表是ORDER BY id ASC

比如我想從表中選擇行,直到我的股票「50」總和,那麼結果將是

#result 3 rows 
+-------+----------+ 
| id | stock | 
+-------+----------+ 
| 1 | 20 | 
+-------+----------+ 
| 2 | 25 | 
+-------+----------+ 
| 3 | 10 | 
+-------+----------+ 

股票的總和,現在是「55」,這是最接近可能高於'50'的價值,如果我們採取下一行id:4股票的總和將高於50,並且如果我們刪除行id:3該值將是45,這比我想要的股票50更少。

我可以通過選擇所有行並循環扔它們來實現這一點,但我想這將是一種浪費。 有沒有一種可能的方法在較低級別上執行該操作,並讓mysql通過sql查詢爲我執行該操作?

謝謝你,原諒我,如果我搞砸的東西,我是新來的編程

回答

2

需要在此累計總和的工作。一種方法使用變量:

select t.* 
from (select t.*, (@sum := @sum + stock) as cume_stock 
     from t cross join 
      (select @sum := 0) params 
     order by id 
    ) t 
where cume_stock < 50 or (cume_stock >= 50 and cume_stock - stock < 50); 
+0

非常感謝您的時間先生。順便說一句,你的名字給了我一種*「沒有想到,那就是我正在嘗試做的事情」的感覺* –

+0

我很抱歉再次打擾你,但是我得到一個語法錯誤*「錯誤代碼:1064.你有一個錯誤在您的SQL語法;檢查對應於您的MariaDB服務器版本的手冊,以在第6行使用正確語法''t 其中cume_stock <50或(cume_stock> = 50且cume_stock - 庫存<50)'\t 0.000 sec「* –

+0

我從t交叉聯接(選擇@sum:= 0)params order by id」'將子查詢的訂單子句移動到子句之前,並且語法錯誤消失。這是否會給我同樣的正確結果? –

相關問題