The following query:
SELECT * FROM
(SELECT id,
count,
@running_count := @running_count + count AS Counter
FROM sumtest, (SELECT @running_count := 0) AS T1 ORDER BY id) AS TableCount
WHERE TableCount.Counter < 50;
gives the results:
id count Counter
1 30 30
2 10 40
3 5 45
I copied your table to MySql and named it "sumtest". Please replace the name of your table.
Effectively, we determine the current total in order of id, and then use it as a subquery.
So this query:
SELECT id,
count,
@running_count := @running_count + count AS Counter
FROM sumtest, (SELECT @running_count := 0) AS T1
ORDER BY id
It produces:
id count Counter
1 30 30
2 10 40
3 5 45
4 20 65
5 15 80
So, it becomes a trivial question to select all those lines where the counter is less than your desired amount by making another choice.
EDIT: . ( , sumtest, - root @localhost ):
DELIMITER $$
DROP FUNCTION IF EXISTS `Test_Cursing` $$
CREATE DEFINER=`root`@`localhost` FUNCTION `Test_Cursing`(_running_total_limit INT) RETURNS int
BEGIN
/* Why am I on StackOverflow at 01:41 on New Years Day. Dear oh dear, where the beer? */
DECLARE _running_count INT default 0;
DECLARE _id INT;
DECLARE _current_id INT;
DECLARE _sum_count INT;
DECLARE _cur CURSOR FOR SELECT id, count FROM sumtest ORDER BY id;
OPEN _cur;
read_loop: LOOP
FETCH _cur INTO _id, _sum_count;
SET _running_count = _running_count + _sum_count;
IF _running_count > _running_total_limit THEN
LEAVE read_loop;
END IF;
SET _current_id = _id;
END LOOP;
CLOSE _cur;
RETURN _current_id;
END $$
DELIMITER ;
:
SELECT Test_Cursing(50);
id = 3 - id , . :
SELECT * FROM sumtest WHERE id <= Test_Cursing(50);
:
id count
1 30
2 10
3 5