2011-11-02 85 views
0

我想通過總和來限制mySQL中的SELECT結果。 例如,這是我的表:MySQL總和限制

(id, val) 

數據條目: (1100), (2300), (3,50), (4,3000)

我想選擇第一個 k個條目,使得這些條目中的val的總和剛好足以使其達到M. 例如,我想查找M = 425的條目。 結果應該是(1,100),( 2300),(3,50)。

我該如何在mysql select查詢中做到這一點?

回答

0

從MySQL參考手冊:

LIMIT子句可以用來限制由SELECT語句返回的行的數目。 LIMIT需要一個或兩個數字參數,它們都必須是非負整數常量(除了使用預準備語句時)。

所以你不能用你提出的方式來限制。要達到您想要的效果,您需要使用您的應用程序(java,c,php或其他),逐行讀取結果集,並在達到條件時停止。

或者你可以使用預先準備好的語句,但無論如何你不能有條件限制(它必須是一個常數值),它並不完全符合你的要求。

2

試試這個變種 -

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 | 
+------+------+ 
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 ; 

請隨意更改表名或變量名,按您的需求。

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 = @[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