2009-06-15 46 views
2

这是我正在尝试对较大的连接查询进行的简化查询。它仍在打破这个小规模。我正在尝试为1-60范围内的每一行生成一个随机数。然后我想用这个随机数来排序返回的行。为什么MySQL Rand()讨厌我?

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

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

活动表格返回randomtimer列中的所有1。如果我用randomtimer ASC命令,他们会变成60岁。如果我从Order By Clause中删除randomtimer,它会返回正确的单个值。所以有些东西正在调整ORDER BY表达式的值。

任何人有任何想法呢?我可以俯视一些东西吗? WTF? WTF?

+0

你为什么要随机排序? – 2009-06-15 21:09:43

回答

7

除了什么先生,未知的说,还有另一个问题。

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

所以这可能是由于您的生产数据比开发服务器上的数据多得多。

6

RAND docs

你不能在一个ORDER与RAND使用列() 值BY子句,因为 ORDER BY 多次将评估列。但是,您可以 以随机顺序检索行像这样 :

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

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

0

我决定取消这个想法,并在php中创建一个随机数组,其长度与返回结果的长度相同,并对其进行排序和使用。

0

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

只是一个想法。