请考虑以下几点:
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查询可以做这样的事情吗?还是我需要用别的方法?
提前感谢!
发布于 2015-05-07 16:22:16
你想要一个加权抽样。这其实很简单,一旦你有了所有权重的累积和。
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是所有权重之和。因此,它将这个值乘以一个随机数,并找到大于或等于这个值的第一个累积权重。
发布于 2015-05-07 17:05:26
这是你的彩票的解决方案:-)
如果您需要了解它是如何工作的,只需注释查询WHERE ...的最后一行
http://sqlfiddle.com/#!9/54a44/17
SELECT *
FROM (SELECT *,
IF(@total IS NULL,@first:=1, @first:=@total+1) from_number,
IF(@total IS NULL,@total:=tickets, @total:=@total+tickets) to_number,
IF(@winner IS NULL,@winner:= FLOOR( 1 + RAND( ) * t_sum.t_all), @winner) win
FROM tickets
LEFT JOIN (SELECT SUM(tickets) t_all FROM tickets) t_sum
ON 1) t
WHERE win >= from_number AND win <= to_numberhttps://stackoverflow.com/questions/30106262
复制相似问题