MySQL的总和限制

时间:2011-11-02 07:24:32

标签: mysql select limit

我想用sum来限制mySQL中的SELECT结果。 例如,这是我的表:

(id, val)

数据条目: (1100), (2300), (3,50), (4,3000)

我想选择第一个个k条目,使得这些条目中 val 的总和足以使其成为M. 例如,我想找到M = 425的条目。 结果应为(1,100),(2,300),(3,50)。

我如何在mysql选择查询中执行此操作?

4 个答案:

答案 0 :(得分:2)

尝试此变体 -

SET @sum = 0;
SELECT id, val FROM (
  SELECT *, @sum:=@sum + val mysum FROM mytable2 ORDER BY id
) t
WHERE mysum <= 450;

+------+------+
| id   | val  |
+------+------+
|    1 |  100 |
|    2 |  300 |
|    3 |   50 |
+------+------+

答案 1 :(得分:1)

此存储过程可能有所帮助:

DELIMITER ;;

CREATE PROCEDURE selectLimitBySum (IN m INT)
BEGIN
DECLARE mTmp INT DEFAULT 0;
DECLARE idTmp INT DEFAULT 0;
DECLARE valTmp INT DEFAULT 0;
DECLARE doneLoop SMALLINT DEFAULT 0;
DECLARE crsSelect CURSOR FOR SELECT id, val FROM test3;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET doneLoop = 1;
OPEN crsSelect;
aloop: LOOP
    SET idTmp = 0;
    SET valTmp = 0;
    FETCH crsSelect INTO idTmp, valTmp;
    if doneLoop THEN
        LEAVE aloop;
    END IF;
    SELECT idTmp, valTmp;
    SET mTmp = mTmp + valTmp;
    if mTmp > m THEN
        LEAVE aloop;
    END IF;
END LOOP;
CLOSE crsSelect;
END ;;

DELIMITER ;

请随意根据您的需要更改表名或变量名。

答案 2 :(得分:0)

来自mysql参考手册:

LIMIT子句可用于约束SELECT语句返回的行数。 LIMIT需要一个或两个数字参数,它们都必须是非负整数常量(使用预准备语句时除外)。

所以你不能以你提出的方式使用限制。要实现您的需要,您需要使用您的应用程序(java,c,php或其他),逐行读取结果集,并在达到条件时停止。

或者你可以使用准备好的陈述,但无论如何你不能有条件限制(它必须是一个常数值)并且它不是你要求的。

答案 3 :(得分:0)

create table #limit(
id int,
val int
)

declare @sum int, @id int, @val int, @m int;
    set @sum=0;
    set @m=250; --Value of an entry
    declare limit_cursor cursor for
    select id, val from your_table order by id
    open limit_cursor
    fetch next from limit_cursor into @id, @val
    while(@@fetch_status=0)
    begin
        if(@sum<@m)
        begin
            set @sum = @sum+@val;
            INSERT INTO #limit values (@id, @val);
            fetch next from limit_cursor into @id, @val
        end
    else 
    begin
    goto case1; 
    end
    end
    case1:
    close limit_cursor
    deallocate limit_cursor
    select * from #limit
    truncate table #limit