从MySQL中选择随机行(概率)

Jam*_*son 6 mysql probability

我有一个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.

Vit*_*nko 4

如果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;