如何根据分配给每一行的概率机会从数据库中选择随机行。
例:
Make Chance Value
ALFA ROMEO 0.0024 20000
AUDI 0.0338 35000
BMW 0.0376 40000
CHEVROLET 0.0087 15000
CITROEN 0.016 15000
........
如何根据必须选择的随机性来选择随机品牌名称及其值。
rand()
和ORDER BY
的组合可以工作吗?如果是这样,最好的方法是什么? 最佳答案
您可以使用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
时停止子查询来提高效率。