在MySQL中以一定的机会(权重)挑选随机行

时间:2014-03-20 16:18:57

标签: mysql random

我搜索了一段时间,但结果只是让我感到困惑,因为我对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

注意:这些都是简单的例子,会有像这样的x100。我需要做的是从这个表中选择一行,如CHANCE列所示。

含义;我需要从他们中的9个中挑选一行,结果可以是“VERSICOLOR,DIVERSIPES,AMAZONICA或NOTHING,有35%的几率”或“EMILIA,BOEHMI或SMITHI有25%的几率”或“METALLICA或REGALIS有%5的机会”。因此,这个查询可能会给我“VERSICOLOR,DIVERSIPES,AMAZONICA或NOTHING”的结果,因为它有35%的机会或者我很幸运,我会得到“METALLICA或REGALIS”:)

基本上有3组类型,GROUND,TREE和SKY。我想要做的只是从所有这些中得到一个结果。 GROUND,TREE或SKY型项目有一定的机会,但可以肯定的是,我不想要每个组一个,我只想要一个结果,它可以是GROUND,TREE或SKY类型的项目。 我希望我自己解释一下。问候。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

此问题出现在SQL之外。我在这里发布了一个通用解决方案,generate random numbers within a range with different probabilities

使用您使用的第一组数字(70%,25%,5%)填充三个骨灰盒,每个100个球。 Urn 0所有球都是红色的。 1 1 75个球是绿色的,25个球是红色的。最后,urn 2将有15个蓝色球和85个红球。现在选择一个随机的瓮,每个都有1/3的概率,然后选择一个随机的球。使用这种方案,获得红球的概率为0.75,绿球的概率为0.25,蓝球的概率为0.05。