有机会选择MySQL记录

时间:2013-07-04 18:15:09

标签: php mysql sql algorithm

我有一个包含3个字段的MySQL表,如下所示。

id, name, chance
1001, name1, 1
1002, name2, 3
1003, name3, 1

我想随机选择一条记录100次。在100次中,我希望记录ID 1001被选择20次(1/5几率),记录ID 1002被选择60次(3/5次机会),并且记录id 1003被选择20次(1/5)几率)。

如何在MySQL和/或PHP中执行此操作?

非常感谢提前!

2 个答案:

答案 0 :(得分:2)

要在php中使用

生成一个随机数
int rand ( int $min , int $max )

然后使用一系列if语句。

例如:

$random = rand (1,100);
(INSERT LOOP)
if ($random <= 20){
$id1001 = $id1001 + 1;
}
else if ($random > 20 and $random < 80){
$id1002 = $id1002 + 1;
}
else if ($random > 80 and $random < 100){
$id1003 = $id1003 + 1;
}
(END LOOP)

答案 1 :(得分:2)

在SQL中执行此操作有点挑战性。如果您的数字真的很小,最简单的方法是通过cross join来乘以记录,然后从那里取一个随机行:

select t.*
from t join
     (select 1 as n union all select 2 union all select 3) n
     on n.n <= t.chance
order by rand()
limit 1;

如果“机会”是一个小整数,则可行。

否则,我认为您需要累积的机会总和然后进行比较。类似的东西:

select t.*
from (select t.*, (@sumchance := @sumchance + chance) as sumchance
      from t cross join (select @sumchance := 0) const
     ) t cross join
     (select sum(chance) as totchance from t) tot
where rand()*totchance between sumchance - chance and sumchance
limit 1;

这计算了给定行的机会总和(该顺序没有区别,因为这是随机的)。然后,它会计算相同范围内的随机数,并将其与sumchance - chancechance进行比较。这应该返回一行,但是有一个边界情况,rand()*totchance正好等于sumchance。可以返回任何一行。 limit 1将其限制为一行。