我猜測,「賠率」是不是整數,你想要的東西,有一個「9」是九倍,比「1」的可能性較大。
這樣做的正確方法是累積和。然後在累計和的最小值和最大值之間生成一個隨機值,並選擇該範圍內的記錄。下面的查詢這是否在MySQL:
select t.*
from (select t.*,
coalesce((select sum(odds) from t t2 where t2.id < t.id), 0) as cumsum,
const.sumodds
from t cross join
(select rand()*sum(odds) as val from t) const
) t
where val between cumsum and cumsum + t.odds
然而,這是做非等值連接,並很可能會在MySQL昂貴。其他數據庫有能力在單個查詢中執行累計和。 MySQL沒有這樣做的有效方式。
如何優化查詢取決於問題中的某些其他因素。 「賠率」有多少個不同的值?你可以使用臨時表嗎?
我現在沒有時間寫出解決方案,但有一種更有效的方法。是的想法是將問題分成兩個搜索。第一個會發現哪個「賠率」值勝。第二個將找到哪一行勝出。
下面是詳細信息:
(1)由所述賠率總結數據插入表中。該表格將有11行,幷包含每個行的「可能性」和「計數」。(2)計算每行的「count * odds」的總和,從第一行的0開始計算。你可以使用上面的查詢作爲指導,因爲這是很少量的數據,它會很快運行。
(3)計算一個隨機數爲rand()*<sum of all odds>
。現在,找出數字在cumsum和cumsum +賠率之間的機率。
(4)現在返回到原始表併發出一個查詢,如:
select *
from t
where odds = <winning odds>
order by rand()
limit 1
什麼那些勝算呢?你打算如何使用它們?你有什麼嘗試? –
你正在使用什麼數據庫? – andrefsp
嗨,賠率意味着每個用戶的獲勝機會。我正在使用MySQL數據庫。 –