使用MySQL RAND()来避免ORDER BY RAND()

时间:2013-12-25 13:21:19

标签: mysql

我在每个插入的表中存储RAND()值,然后运行以下查询以从表中获取随机行。

select id from test where random_value >= RAND() LIMIT 5;

表中总共有456行,但随机值仅占用前20-25条记录。我在查询上面运行了很多次但从未得到id > 21

您可以找到查询和结果here

2 个答案:

答案 0 :(得分:1)

每次循环后您的RAND()更改。您需要在SELECT之前修复它:

SET @r := RAND();
SELECT id, @r
FROM test
WHERE random_value >= @r
LIMIT 5

但这不是一个好的解决方案,因为在随机数的情况下,您将始终从DB获得相同的行。

为了保存性能,您可以使用this方法。我尝试了它,但它确实有效。

答案 1 :(得分:0)

我找到了这个解决方案,它运作得很完美!

SELECT  rnd_id, rnd_value
FROM    (
        SELECT  @cnt := COUNT(*) + 1,
                @lim := 10
        FROM    t_random_innodb
        ) vars
STRAIGHT_JOIN
        (
        SELECT  r.*,
                @lim := @lim - 1
        FROM    t_random_innodb r
        WHERE   (@cnt := @cnt - 1)
                AND RAND(20090301) < @lim / @cnt
        ) i

来源:http://explainextended.com/2009/03/01/selecting-random-rows/