我在每个插入的表中存储RAND()
值,然后运行以下查询以从表中获取随机行。
select id from test where random_value >= RAND() LIMIT 5;
表中总共有456行,但随机值仅占用前20-25条记录。我在查询上面运行了很多次但从未得到id > 21
。
您可以找到查询和结果here。
答案 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/