2012-08-13 30 views
4

我有一个表具有以下信息的总和:Mysql的选择行的

 

id |  Item ID  | stock_package_id | amount | price 
0 |  775  |   1  | 16 | 0.22 
1 |  758  |   2  | 10 | 0.28 
2 |  775  |   3  | 10 | 0.30 
3 |  774  |   4  | 10 | 0.25 
4 |  775  |   5  | 10 | 0.10 
5 |  775  |   6  | 10 | 0.55 


我的问题是我想要创建一个查询(简单越好,因为这表将留下一个加盟几个其他桌子),这将允许我输入金额:

eg

我希望Item_Id 775中的22个先从最便宜的价格中选择。

所以,我想回的是:

 

id |  Item ID  | stock_package_id | amount | price 
4 |  775  |   5  | 10 | 0.10 
0 |  775  |   1  | 12 | 0.22 - this is only 12 as we only want 22 total 

一个04-0030-03例如:

从stock_table选择,直到amount总和大于输入数(22)按价格

为了等于或大于

这可能与MySql有关吗?

+0

嗯。 “有和” 允许你设置的相加条件..和“订单按......上升“可以让你订购金额。 – 2012-08-13 10:52:57

+0

你可以修改“我想要返回什么”到你真正想要的东西吗?我看不到一个SUM(..)'d列,22有 – Martin 2012-08-13 10:54:16

+0

@Martin这是点。它应该显示我只有22行。 – james 2012-08-13 10:58:25

回答

4

架构:

CREATE TABLE table1 
(`id` int, `Item_ID` int, `stock_package_id` int, `amount` int, `price` float); 

INSERT INTO table1 
(`id`, `Item_ID`, `stock_package_id`, `amount`, `price`) 
VALUES 
(0, 775, 1, 16, 0.22), 
(1, 758, 2, 10, 0.28), 
(2, 775, 3, 10, 0.30), 
(3, 774, 4, 10, 0.25), 
(4, 775, 5, 10, 0.10), 
(5, 775, 6, 10, 0.55); 

设置量获得:

SET @var_amount = 22; 

选择量:

SELECT * FROM (
SELECT table1.*, if ((@var_amount := @var_amount - amount) > 0, amount, amount + @var_amount) as buy_amount 
FROM table1 
WHERE Item_ID = 775 
ORDER BY price ASC 
) AS tmp 
WHERE buy_amount > 0 

结果:

id Item_ID stock_package_id amount price buy_amount 
4 775 5      10  0.1  10 
0 775 1      16  0.22 12 
5

您需要根据price列使用ORDER BY子句对记录进行排序:

SELECT * 
FROM table_name 
WHERE Item_ID = 775 
ORDER BY price ASC 
LIMIT 22; 
如果你想获取记录,直到 sum(price)成为

value(22),那么试试这个:

SELECT * 
FROM table_name, (SELECT @var_price := 0) a 
WHERE Item_ID = 775 AND 
     (@var_price := @var_price + price) <= 22 
ORDER BY price ASC; 
+2

OP要sum'amount'等于22 – 2012-08-13 10:49:51

+1

这不会限制为22行不总和的数量是== 22吗? – james 2012-08-13 10:52:59

+0

谢谢! @james:右键更新了我的帖子。 – Omesh 2012-08-13 10:56:03