2009-06-15 47 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函數使用時間作爲它的種子。在實時系統上,整個查詢在同一毫秒內完成,因此所有隨機數字都是相同的。在開發系統上,它需要更長的時間,以便獲得更多的隨機數字。如果你的實時系統比你的開發系統更強大,那麼可能是有道理的。

只是一個想法。