我搜索了一段时间,但结果只是让我感到困惑,因为我对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类型的项目。 我希望我自己解释一下。问候。
答案 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。