在MySQL中以特定几率(权重)随机选择行

3

我已经搜索了一段时间,但结果让我感到困惑,因为我对MySQL还很陌生。

我有一个包含这4个列的表: AUTO_INCREMENT ID、NAME、TYPE、CHANCE,所以行看起来像这样:

1, NOTHING, NO, 35
1, VERSICOLOR, TREE, 35
3, DIVERSIPES, TREE, 35
4, AMAZONICA, TREE, 35
5, EMILIA, GROUND, 25
6, BOEHMI, GROUND, 25
7, SMITHI, GROUND, 25
8, METALLICA, SKY, 5
9, REGALIS, SKY, 5

注意:这些只是简单的例子,会有100多个类似的例子。我需要做的是从该表中选择一行,选择的概率如“CHANCE”列所示。
意思是:我需要从9行中选择一行,结果可能是“VERSICOLOR、DIVERSIPES、AMAZONICA或NOTHING,概率为35%”,或者是“EMILIA、BOEHMI或SMITHI,概率为25%”,或者是“METALLICA或REGALIS,概率为5%”。因此,这个查询可能会给我“VERSICOLOR、DIVERSIPES、AMAZONICA或NOTHING”的结果,因为它有35%的机会,或者我运气好,会得到“METALLICA或REGALIS” :)
基本上有3种类型的组,地面、树和天空。我想要做的就是从所有这些类型中仅获取一个结果。地面、树或天空类型的物品具有特定的概率,但要确定,我不希望每个组都有一个,我只想要一个结果,它可以是地面、树或天空类型的物品。 希望我已经解释清楚了。问候。
2个回答

0

这个问题不仅限于SQL。我在这里发布了一个通用解决方案,生成不同概率范围内的随机数

使用第一组数字(70%,25%,5%),将100个球放入三个瓮中。瓮0中所有球都是红色的。瓮1中有75个绿球和25个红球。最后,瓮2中将有15个蓝球和85个红球。现在随机选择一个瓮,每个瓮的概率为1/3,并选择一个随机球。使用此方案,获得红球的概率为0.75,绿球的概率为0.25,蓝球的概率为0.05。


0

可能有更加优雅的解决方案,而且不需要假设您的百分比总和为100-但这个方法可能有效:

示例 http://sqlfiddle.com/#!2/ec699/1

SELECT *
FROM (
  SELECT id, name, type, chance
    , @value + 1 AS lowval
    , @value := @value + chance AS hival
  FROM tbl
  JOIN (SELECT @value := 0) AS foo) AS bar
JOIN (SELECT FLOOR(1 + RAND()*99) AS guesser) AS bar2
  ON guesser  BETWEEN lowval and hival;

我尝试更具体地说明。我尝试了你的建议,但是当你乘以选项时它不起作用。请再次检查问题,我进行了一些更正。 - user3442854

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接