我想用sum来限制mySQL中的SELECT
结果。
例如,这是我的表:
(id, val)
数据条目: (1100), (2300), (3,50), (4,3000)
我想选择第一个个k条目,使得这些条目中 val 的总和足以使其成为M. 例如,我想找到M = 425的条目。 结果应为(1,100),(2,300),(3,50)。
我如何在mysql选择查询中执行此操作?
答案 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