考虑以下几点:
user_id weight
1 2
2 5
是否有一个查询可以随机选择一个用户 ID,同时使用权重来影响选择哪个 ID 的几率?
换句话说,在这种情况下,是否有一个查询会查看此表,然后从以下组中随机选择 1 个用户 ID:
[UserID_001, UserID_001, UserID_002, UserID_002, UserID_002, UserID_002, UserID_002]
因此 UserID_002 有 5/7 的机会被选中,而 UserId_001 有 2/7 的机会被选中。
这就像每个用户在抽奖事件中都有多张票,User_001 有 2 张票,User_002 有 5 张票。是否可以用 SQL 查询来做这样的事情?或者我需要使用其他方法吗?
提前致谢!
最佳答案
您需要加权抽样。这实际上非常简单,一旦您获得了所有权重的累加和。
select t.*
from (select t.*,
(@w := @w + weight) as cumew
from table t cross join
(select @w := 0) init
) t
where @w * rand() <= cumew
order by weight
limit 1;
注意在外部查询中,@w
是所有权重的总和。因此,它将此值乘以一个随机数,并找到大于或等于此值的第一个累积权重。
关于mysql - 在具有相同值的多个实例的 SQL 中选择随机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30106262/