【问题标题】:MySQL random record with a bias带有偏差的 MySQL 随机记录
【发布时间】:2011-08-01 02:32:03
【问题描述】:

我想从表中选择一条随机记录,但偏向于特定字段中的更高值 - 我不希望任何记录有 0% 的机会被选中,只是不太可能被选中.

从这篇文章中,我知道随机选择可能会很慢,您可以加快它们的速度: http://wanderr.com/jay/order-by-slow/2008/01/30/

但是,当您处理几个带有连接和 where 语句的表时,并希望使用其中一个字段作为一种偏向随机性的方式(该字段的值越高,被选中的可能性越大)怎么办? ?例如:

SELECT a.id, a.date, a.userid, b.points FROM table_a AS a INNER JOIN table_b AS b ON (a.userid = b.userid) WHERE DATE_SUB(CURDATE(), INTERVAL 60 DAY) <= a.date

我怎样才能将上述内容变成一个有效但不是真正随机的查询,该查询会偏向于更高的 b.points 值?

【问题讨论】:

    标签: mysql performance select random


    【解决方案1】:

    我的2分钱,有偏见的可以这样进行:

    假设分数在 0、100 之间。

    你随机选择5条记录>75,3条记录>50,2条记录>25,1条记录>0

    现在,如果您再次从这 11 条记录中随机抽取,则会偏向更高的分数。

    要将它们放入 sql 中,将您的连接表称为“abc”

    Select * from (
    select * from abc where b.points > 75 order by rand() limit 5
    cross join 
    select * from abc where b.points > 50 and b.points <75 order by rand() limit 3
    cross join 
    select * from abc where b.points > 25 and b.points <50 order by rand() limit 2
    cross join 
    select * from abc where b.points > 0 and b.points <25 order by rand() limit 1
    ) as result
    order by rand() limit 3
    

    性能方面,我会查看您的链接并更新此 anwser。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-29
      • 1970-01-01
      • 2011-05-03
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      • 1970-01-01
      • 2011-03-02
      相关资源
      最近更新 更多