Вы можете сделать это с помощью встроенных переменных и некоторых подзапросов к:
- порядок записей по видам продукции, а затем номер предварительного заказа;
- добавлять значения для суммарной суммы, сбрасывая ее, когда запись имеет другую ссылку на продукт, и устанавливает значение boolean в true, когда сумма пересекает минимальный порог;
- фильтр для записей, в которых совокупная величина была отмечена как пересекающая минимальный порог.
Я предположил, что minimum_qty
хранится в таблице product
:
select product_id,
minimum_qty,
pop_order_num,
cumul_qty
from (
select @newqty := if(@p = product_id, @qty, 0) + qty,
(@qty < minimum_qty and @newqty >= minimum_qty) filter,
@p := product_id as product_id,
minimum_qty,
pop_order_num,
@qty := @newqty as cumul_qty
from (
select pop.product_id,
pop.pop_order_num,
pop.pop_qty - pop.pop_supplied_qty as qty,
p.minimum_qty
from pre_order_dt pop
inner join product p on p.product_id = pop.product_id
order by product_id,
pop_order_num
limit 10000000000
) as base,
(select @qty := 0) as init
) as extend
where filter
SQL fiddle.
Обратите внимание, что пункт limit
является лишь предосторожным, так как движок MySql не должен подчиняться order by
, так как он встречается во внутреннем запросе. Добавляя предложение limit
(которое должно указывать очень высокое значение, поэтому оно фактически не оставляет записи), MySql будет принудительно применять order by
перед обработкой запросов, в которые этот внутренний запрос завернут.
Это ответ на ваш вопрос вопрос? – trincot
Не могли бы вы сообщить мне, было ли это вам полезно? – trincot