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

上面每次都需要创建一个临时表,效率不高,不符合条件。

如何正确地做到这一点?

4

2 回答 2

1

如果我理解正确,您希望Rth有序结果集中的行R是随机数。如果是这样,那么带有两个参数的 LIMIT 选项似乎是您想要的。第一个参数可以是来自 的随机数1 to N

SELECT ... order by weight desc limit R,1

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

于 2010-04-20T14:39:00.350 回答
0

你应该看看:

http://akinas.com/pages/en/blog/mysql_random_row/

有几个建议可以在避免表扫描的同时实现这一点,包括:

SELECT * FROM `table` WHERE id >= (
        SELECT FLOOR( MAX(id) * RAND()) FROM `table` 
    ) ORDER BY id LIMIT 1;
于 2010-04-20T10:07:48.957 回答