我推测“赔率”不是整数,并且您希望具有“9”的东西比“1”的可能性高 9 倍。
正确的方法是使用累积总和。然后在累积和的最小值和最大值之间生成一个随机值,并选择该范围内的记录。以下查询在 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 没有有效的方法来做到这一点。
如何优化查询取决于问题中的某些其他因素。“赔率”有多少种不同的值?可以使用临时表吗?
我现在没有时间写出解决方案,但是有一种更有效的方法。Y想法是将问题分成两个搜索。第一个将找出哪个“赔率”值获胜。第二个将找出哪一行获胜。
以下是详细信息:
(1) 将数据按赔率汇总成表格。该表将有 11 行,并包含每行的“赔率”和“计数”。
(2) 计算每一行的“count*odds”之和,第一行从0开始。您可以使用上述查询作为指导,因为这是少量数据,它会快速运行。
(3) 计算一个随机数为rand()*<sum of all odds>
。现在,找到数字在 cumsum 和 cumsum+odds 之间的赔率。
(4) 现在返回原始表并发出查询,例如:
select *
from t
where odds = <winning odds>
order by rand()
limit 1