我想从表中选择一条随机记录,但偏向于特定字段中的较高值——我不希望任何记录有 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 值?
最佳答案
我的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
在性能方面,我会查看您的链接并更新此答案。
关于带有偏差的MySQL随机记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6893750/