Det närmaste svaret jag kan ge är detta
set @cnt = 0;
set @cursum = 0;
set @cntchanged = 0;
set @uqid = 1;
set @maxsumid = 1;
set @maxsum = 0;
select
t.id,
t.name,
t.cnt
from (
select
id + 0 * if(@cnt = 30, (if(@cursum > @maxsum, (@maxsum := @cursum) + (@maxsumid := @uqid), 0)) + (@cnt := 0) + (@cursum := 0) + (@uqid := @uqid + 1), 0) id,
name,
@uqid uniq_id,
@cursum := if(@cursum + price <= 500, @cursum + price + 0 * (@cntchanged := 1) + 0 * (@cnt := @cnt + 1), @cursum + 0 * (@cntchanged := 0)) as cursum, if(@cntchanged, @cnt, 0) as cnt
from (select id, name, price from items order by rand() limit 10000) as orig
) as t
where t.cnt > 0 and t.uniq_id = @maxsumid
;
Så hur fungerar det? Först väljer vi 10k slumpmässigt ordnade rader från objekt. Efter det summerar vi priser på artiklar tills vi når 30 artiklar med summan mindre än 500. När vi hittar 30 artiklar upprepar vi processen tills vi går igenom alla 10 000 utvalda artiklar. När vi hittar dessa 30 föremål sparar vi maximalt hittat belopp. Så i slutet väljer vi 30 objekt med störst summa (vilket betyder den som är närmast målet 500). Jag är inte säker på om det var vad du ursprungligen ville ha, men att hitta den exakta summan av 500 skulle kräva för mycket ansträngning på DB-sidan.