我想通過總和來限制mySQL中的SELECT
結果。 例如,這是我的表:MySQL總和限制
(id, val)
數據條目: (1100), (2300), (3,50), (4,3000)
我想選擇第一個 k個條目,使得這些條目中的val的總和剛好足以使其達到M. 例如,我想查找M = 425的條目。 結果應該是(1,100),( 2300),(3,50)。
我該如何在mysql select查詢中做到這一點?
我想通過總和來限制mySQL中的SELECT
結果。 例如,這是我的表:MySQL總和限制
(id, val)
數據條目: (1100), (2300), (3,50), (4,3000)
我想選擇第一個 k個條目,使得這些條目中的val的總和剛好足以使其達到M. 例如,我想查找M = 425的條目。 結果應該是(1,100),( 2300),(3,50)。
我該如何在mysql select查詢中做到這一點?
從MySQL參考手冊:
LIMIT子句可以用來限制由SELECT語句返回的行的數目。 LIMIT需要一個或兩個數字參數,它們都必須是非負整數常量(除了使用預準備語句時)。
所以你不能用你提出的方式來限制。要達到您想要的效果,您需要使用您的應用程序(java,c,php或其他),逐行讀取結果集,並在達到條件時停止。
或者你可以使用預先準備好的語句,但無論如何你不能有條件限制(它必須是一個常數值),它並不完全符合你的要求。
試試這個變種 -
SET @sum = 0;
SELECT id, val FROM (
SELECT *, @sum:[email protected] + val mysum FROM mytable2 ORDER BY id
) t
WHERE mysum <= 450;
+------+------+
| id | val |
+------+------+
| 1 | 100 |
| 2 | 300 |
| 3 | 50 |
+------+------+
此存儲過程可以幫助:
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 ;
請隨意更改表名或變量名,按您的需求。
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 = @[email protected];
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