मेरे द्वारा दिया जा सकने वाला निकटतम उत्तर यह है
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
;
तो यह कैसे काम करता है? सबसे पहले हम आइटम से यादृच्छिक रूप से ऑर्डर की गई 10k पंक्तियों का चयन करते हैं। इसके बाद हम वस्तुओं की कीमतों को तब तक जोड़ते हैं जब तक कि हम 500 से कम राशि के साथ 30 वस्तुओं तक नहीं पहुंच जाते। जब हमें 30 आइटम मिलते हैं तो हम प्रक्रिया को तब तक दोहराते हैं जब तक हम सभी 10k चयनित वस्तुओं के माध्यम से नहीं चलते। इन 30 वस्तुओं को खोजते समय हम अधिकतम प्राप्त राशि को बचाते हैं। इसलिए अंत में हम अधिकतम योग के साथ 30 आइटम का चयन करते हैं (अर्थात लक्ष्य 500 के सबसे करीब)। सुनिश्चित नहीं है कि क्या आप मूल रूप से यही चाहते थे, लेकिन सटीक खोजना 500 के योग के लिए DB पक्ष पर बहुत अधिक प्रयास की आवश्यकता होगी।