2013-03-11 111 views
3
SELECT * FROM dogs order by rand(dayofyear(CURRENT_DATE)) LIMIT 1 

在我看來,它通過隨機數命令一個數據庫,並且這個數字每天都在變化。這是一個猜測,因爲它需要我花一天時間來確定這是否屬實!請解釋這個mysql查詢。

我該如何更改此查詢,以便每分鐘而不是每天都按新的隨機數來訂購數據庫?我嘗試這樣做:

SELECT * FROM dogs order by rand(minuteofhour(CURRENT_DATE)) LIMIT 1 

,但它並沒有爲你的時間工作:(

感謝

回答

4

隨機數發生器(RNG),通常需要一個「種子值」,一個值,用於生成隨機數,如果種子值始終相同,則隨機數序列總是相同的,這就解釋了爲什麼它每天都在變化。分鐘)就是找到每分鐘變化的種子值一個是ROUND(UNIX_TIMESTAMP()/60)

SELECT * FROM dogs order by rand(ROUND(UNIX_TIMESTAMP()/60)) LIMIT 1 
+0

什麼是碰撞?爲什麼它比不使用種子更好? – Sebas 2013-03-11 00:53:48

+0

先生,你是個天才。 – Starkers 2013-03-11 01:02:33

+0

@Tom van der Woerdt 嗨湯姆。 數量似乎並沒有種子,當我運行此查詢: SELECT * FROM狗WHERE dateused <$ minute_ago ORDER BY蘭特(ROUND(UNIX_TIMESTAMP()/ 60))LIMIT 1 的WHERE查詢工作,但蘭特的號碼不會播種。每次運行此查詢時,都會生成一個新的數據庫項目。有任何想法嗎? – Starkers 2013-03-11 01:43:14

0

我不擅長mysql。但你確定在mysql中有沒有函數minuteofhour?

查詢的想法是從數據庫中選擇一個隨機記錄。

你可以這樣做: SELECT * FROM狗ORDER BY蘭特(20)LIMIT 1

它將被列順序

0

MySQL的funcs中使用二合一 「隨機從1-20號」 MINUTE()和NOW()。 NOW將返回當前日期,MINUTE會從中提取分鐘值。