带有偏差的MySQL随机记录

标签 mysql performance select random

我想从表中选择一条随机记录,但偏向于特定字段中的较高值——我不希望任何记录有 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/

相关文章:

android - 如何在 Android 中立即从服务器获取新数据?

mysql - 从 cygwin 连接到 mysql

r - 预先计算长度未知的向量 - 我应该 "grow"吗?

MYSQL:查询未正确考虑最大日期时间列

select - 如何从 knockout.js observableArray 中获取选定的菜单选项?

ruby-on-rails - 如何覆盖 ruby​​ 中的 [] 括号?

php mysql查询字符集

mysql - 学说复杂实体

javascript - 为什么使用 for 比 some() 或 filter() 更快

Swift 协议(protocol)性能