使用MySQL RAND()避免按RAND()排序

使用MySQL RAND()避免按RAND()排序,mysql,Mysql,每次插入时,我都将RAND值存储在一个表中,然后运行以下查询以从表中获取随机行 select id from test where random_value >= RAND() LIMIT 5; 一个表中总共有456行,但随机值仅拾取前20-25条记录。我多次运行上述查询,但从未得到id>21 您可以找到查询和结果。每次循环后,您的RAND都会发生变化。您需要先修复它,然后再选择: 但这并不是一个好的解决方案,因为在小随机数的情况下,您总是从DB中获得相同的行 为了节省性能,可以使用方法

每次插入时,我都将RAND值存储在一个表中,然后运行以下查询以从表中获取随机行

select id from test where random_value >= RAND() LIMIT 5;
一个表中总共有456行,但随机值仅拾取前20-25条记录。我多次运行上述查询,但从未得到id>21

您可以找到查询和结果。

每次循环后,您的RAND都会发生变化。您需要先修复它,然后再选择:

但这并不是一个好的解决方案,因为在小随机数的情况下,您总是从DB中获得相同的行


为了节省性能,可以使用方法。我试过了,效果很好。

我找到了这个解决方案,效果非常好

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

来源:

如果这不是一个愚蠢的问题,为什么你要避免兰德公司的订单?这就是为什么要避免它,请从测试中选择id,random_值,RAND1作为rand;卡尔·萨尔丹哈:你们每天都能学到新东西,为此干杯。看来我有一些代码修改要做@Narek的结果是:每次运行都会得到几乎相同的结果,这是因为如果你的rand值为0.1,你总是会看到前5行,因为几乎所有的结果都大于0.1。为了避免得到相同的行,需要通过随机_值添加order,以便得到最接近的5。不只是满足条件的5个。
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