MySQL лимит по сумме - PullRequest
       30

MySQL лимит по сумме

0 голосов
/ 02 ноября 2011

Я хочу ограничить мои SELECT результаты в MySQL суммой. Например, это моя таблица:

(id, val)

Записи данных: (1100), (2300), (3,50), (4,3000)

Я хочу выбрать первые k записей, чтобы сумма val в этих записях была достаточной для того, чтобы добраться до M. Например, я хочу найти записи такие, что M = 425. Результат должен быть (1 100), (2 300), (3,50).

Как я могу сделать это в запросе выбора mysql?

Ответы [ 4 ]

2 голосов
/ 02 ноября 2011

Попробуйте этот вариант -

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 голос
/ 02 ноября 2011

Эта хранимая процедура может помочь:

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 голосов
/ 03 ноября 2011
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
0 голосов
/ 02 ноября 2011

из справочника mysql:

Предложение LIMIT может использоваться для ограничения количества строк, возвращаемых оператором SELECT.LIMIT принимает один или два числовых аргумента, которые оба должны быть неотрицательными целочисленными константами (кроме случаев, когда используются подготовленные операторы).

Таким образом, вы не можете использовать ограничение так, как вы предлагали.Чтобы достичь того, что вы хотите, вам нужно использовать свое приложение (java, c, php или что-то еще), читать строку результатов за строкой и останавливаться, когда ваше условие будет достигнуто.

или вы можете использовать подготовленныйутверждение, но в любом случае вы не можете иметь условный предел (это должно быть постоянное значение), и это не совсем то, что вы просили.

...