Можно ли только средствами MySQL выбрать столько строк, чтобы сумма колонки не превысила N?

Рейтинг: 1Ответов: 2Опубликовано: 16.11.2014

К примеру, есть таблица:

id | m
--------
 1 | 10
 2 | 10
 3 | 400
 4 | 10
 5 | 10

Нужно выбрать последовательно по id столько строк, чтобы сумма m не превысила 435. В данном случае это будут строки 1–4 включительно.

Возможно ли это сделать целиком в MySQL, или нужно в цикле брать пачками, или сразу с запасом, и уже в коде проверять сумму и выбирать строки?

Ответы

▲ 1Принят

Так:

select t.id, sum(ts.m) agg
from tab t 
  left join tab ts on t.id>=ts.id
group by t.id
having sum(ts.m)<435

fiddle

▲ 1

Вариант:

SELECT `t1`.`id`, `t1`.`m`
FROM  `table` `t1`
JOIN  `table` `t2` ON ( `t2`.`id` <= `t1`.`id` )
WHERE  `t1`.`id` > 0 AND  `t2`.`id` > 0 //С какого id берем записи
GROUP BY `t1`.`id` HAVING SUM(`t2`.`m`) <= 435
ORDER BY `t1`.`id` ASC, `t2`.`id` ASC

Хотя красивым я бы его не назвал, но описанную задачу вполне выполняет.