आप rand()
. का उपयोग करके ऐसा कर सकते हैं और फिर एक संचयी राशि का उपयोग करना। मान लें कि वे 100% तक जोड़ते हैं:
select t.*
from (select t.*, (@cumep := @cumep + chance) as cumep
from t cross join
(select @cumep := 0, @r := rand()) params
) t
where @r between cumep - chance and cumep
limit 1;
नोट:
rand()
एक वैरिएबल को इनिशियलाइज़ करने के लिए सबक्वायरी में एक बार कॉल किया जाता है।rand()
. को एकाधिक कॉल वांछनीय नहीं हैं।- इस बात की बहुत कम संभावना है कि यादृच्छिक संख्या दो मानों के बीच की सीमा पर होगी।
limit 1
मनमाने ढंग से 1. चुनता है। - सबक्वायरी को रोककर इसे और अधिक कुशल बनाया जा सकता है जब
cumep > @r
। - मानों का किसी विशेष क्रम में होना जरूरी नहीं है।
- इसे उन अवसरों को संभालने के लिए संशोधित किया जा सकता है जहां योग 1 के बराबर नहीं है, लेकिन यह एक और प्रश्न होगा।