在MySQL中,如何高效地(不使用子查询)从最大的N个记录中选择一个随机记录?

在MySQL中,如何高效地(不使用子查询)从最大的N个记录中选择一个随机记录?,mysql,random,sql-optimization,Mysql,Random,Sql Optimization,上面提到的每次都需要创建一个临时表,这是不高效的,因此不符合条件 如何正确操作?您应该看看: 对于在避免表扫描的同时实现此功能,有几种建议,包括: select .. from ( Select ... from ... order by weight desc limit N ) order by rand() limit 1 如果我理解正确,您希望从排序结果集中得到Rth行,其中R是一个随机数。如果是这样的话,那么带两个参数的限制选项似乎就是您想要的。第一个参数可以是从1

上面提到的每次都需要创建一个临时表,这是不高效的,因此不符合条件


如何正确操作?

您应该看看:

对于在避免表扫描的同时实现此功能,有几种建议,包括:

select .. from (
    Select ... from ... order by weight desc limit N
    ) order by rand() limit 1

如果我理解正确,您希望从排序结果集中得到
Rth
行,其中
R
是一个随机数。如果是这样的话,那么带两个参数的限制选项似乎就是您想要的。第一个参数可以是从
1到N的随机数:

SELECT * FROM `table` WHERE id >= (
        SELECT FLOOR( MAX(id) * RAND()) FROM `table` 
    ) ORDER BY id LIMIT 1;

我没有安装MySQL,所以无法测试它。所以我不知道R是否可以直接使用RAND(),或者它是否需要预先计算。

不同的是,我的问题是从NNice建议中随机选择一行。虽然LIMIT子句不能包含MySQL中的表达式
COUNT(*)>=N
也应为true。@SQL:如果在客户端代码中生成随机值,并且表中的行数小于N,则随机值可能超出范围,结果查询将不返回任何行。
SELECT ... order by weight desc limit R,1