mysql - 在具有相同值的多个实例的 SQL 中选择随机

标签 mysql sql database database-design

考虑以下几点:

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/

相关文章:

mysql - 尝试使用同一表中的值更新表

mysql - C、如何将字符串保存到二进制文件中?

sql - SQL 中的 Row_Number 排名

MySQL获取每个产品组具有最小列值的行

c# - 如何在 Entity Framework Core 1.0 RTM 中关闭级联删除

sql-server - SQL Server 2012 中的故障转移群集和 AlwaysOn 可用性组有什么区别

mysql - 如何体面地跟踪SVN对数据库结构的修改?

mysql - 使用索引优化 MySQL 查询(什么索引?)

java - Postgres : Query in Idle Transaction State

php - 未定义索引 : uploadimage UPDATE: UPLOADS BUT DOESN'T ADD DIRECTORY TO COLUMN