2010-09-15 76 views
1

我使用以下代码从表中返回一个随机行。使用字段'rand'。使用随机索引和RAND提取随机行()

INSERT INTO imgs SET rand = RAND() 

出于某种原因,结果虽然改变每次运行都具有非常低的“兰特”只排场:

SELECT * 
FROM imgs 
WHERE rand > RAND() 
ORDER BY rand ASC 
LIMIT 1 

字段“兰特”是由MySQL在创建使用类似的东西产生。绝对有超过7000行的完整范围。如果我用'WHERE rand> [0-1之间的数字''替换'WHERE rand> RAND()',接缝工作正常'

+0

除了处理100K +行时不能很好地扩展,为什么不只是使用'ORDER BY RAND()'? – 2010-09-15 19:46:22

+0

我正试图为需要定期将我的共享服务器推向极限的客户开发一个非常优化的系统。 显而易见的解决方案是在php中生成随机float,但在SQL语句中,接口更符合逻辑。 – 2010-09-15 21:30:03

回答

0

RAND()生成浮点值x其中0 < = x < = 1.0 .. 。生成一个更大的数字(整数)使用FLOOR(y + (RAND() * z))这将产生一个值x其中y < = x <(y + z)

+0

我知道。问题出于某种原因,在'WHERE'的背景下,它没有缝合以正确生成0-1之间的浮点数。 RAND()用于在插入阶段生成列 – 2010-09-15 21:27:04