为什么MySQL Rand()讨厌我?

时间:2009-06-15 20:45:31

标签: mysql random

这是我在更大的连接查询上尝试做的事情的简化查询。它仍然在这个小规模上打破。我试图为在1-60范围内拉回的每一行生成一个随机数。然后我想用这个随机数来命令返回的行。

 SELECT downloads . * , 
(FLOOR( 1 + ( RAND( ) *60 ) )) AS randomtimer
FROM downloads
ORDER BY randomtimer
LIMIT 25 

我有2个数据库我试过这个查询。一个活的和一个开发的。我并排比较两者,它们在结构上都是一样的。它在开发者上正常工作。返回randomtimer排序的行。

实时表返回randomtimer列中的所有1。如果我通过随机选择ASC订购,他们将成为60年代。如果我从Order By子句中删除randomtimer,它将返回正确的单个值。所以有些东西正在调整ORDER BY语句中的值。

有人对此有任何想法吗?我可能会忽略一些东西吗? WTF? WTF?

4 个答案:

答案 0 :(得分:7)

除了先生。不知道的是,还有另一个问题。

您正在生成1到60之间的随机数,然后选择前25行。如果有足够的行(统计上)以超过25的随机值1结束,那么前面的25行当然在“randomtimer”列中的值都为1。

所以这可能是因为你在生产中只有比在开发服务器上有更多的数据。

答案 1 :(得分:6)

来自RAND docs

  

您无法使用RAND()列   ORDER BY子句中的值,因为   ORDER BY将评估该列   多次。但是,你可以   以随机顺序检索行   这样:

     

的MySQL> SELECT * FROM tbl_name ORDER BY   RAND();

我猜这种差异是由于MySQL版本,查询计划或表数据不同而不知道哪个。

答案 2 :(得分:0)

我决定废弃这个想法,并在php中创建一个与返回结果相同长度的随机数组,然后排序并使用它。

答案 3 :(得分:0)

我会抛出一个想法...... RAND功能正在使用时间作为种子。在实时系统上,整个查询在相同的毫秒内完成,因此所有随机数都是相同的。在开发系统上,它需要更长的时间才能获得更多随机数。如果您的实时系统比您的开发系统更强大,那么可能有意义。

只是一个想法。