我有一个MySQL表,其中有一行名为cur_odds,这是一个百分比数字,该行的概率百分比将被选中.例如,当您运行100个查询时,如何进行实际选择大约该频率的行的查询?
我尝试了以下操作,但是有一个概率为0.35的行最终会在60-70%的时间内被选中.
SELECT * FROM table ORDER BY RAND()*cur_odds DESC
Run Code Online (Sandbox Code Playgroud)
表中cur_odds的所有值都精确地加1.
如果cur_odds很少改变,你可以实现以下算法:
1)创建另一列prob_sum,其中
prob_sum[0] := cur_odds[0]
对于 1 <= i <= row_count - 1:
prob_sum[i] := prob_sum[i - 1] + cur_odds[i]
2)生成0到1之间的随机数:
rnd := 兰特(0,1)
3)找到第一行prob_sum > rnd(如果您在 上创建 BTREE 索引prob_sum,查询应该会更快):
创建索引 prob_sum_ind ON <表> (prob_sum);
设置@rnd := RAND();
从 <表> 中选择 MIN(prob_sum),其中 prob_sum > @rnd;
| 归档时间: |
|
| 查看次数: |
2564 次 |
| 最近记录: |