Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

30 यादृच्छिक पंक्तियों का चयन करें जहां योग राशि =x

मेरे द्वारा दिया जा सकने वाला निकटतम उत्तर यह है

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 पक्ष पर बहुत अधिक प्रयास की आवश्यकता होगी।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL - सही टाइमज़ोन के साथ समय कैसे स्टोर करें? (जावा से)

  2. MySQL त्रुटि:अधिकतम स्तंभ आकार 767 बाइट्स है

  3. एक्लिप्सलिंक और जोडा-टाइम का उपयोग कर डेटाबेस में यूटीसी में डेट-टाइम कैसे स्टोर करें?

  4. Laravel-5 'LIKE' समकक्ष (वाक्पटु)

  5. समान मान वाली तालिका में अन्य पंक्तियों की संख्या