2012-04-21 45 views
1

我要尋找這樣做的更好的辦法:返回一個隨機行不使用ID,MySQL的

SELECT * FROM $tbl_name WHERE id >= (SELECT FLOOR(MAX(id) * RAND()) FROM $tbl_name) ORDER BY id LIMIT 1; 

它是緩慢的,也不是很隨機的,我得到了相同的結果,每10個左右查詢的。

這將從表中選擇一個隨機行,而不管其ID如何。

到目前爲止,我有這樣的:

// Get amount of rows in database 
$result = mysql_query("SELECT * FROM $tbl_name"); 
$num_rows = mysql_num_rows($result); 

// Generate random number 
$random_row = rand(1, $num_rows); 

但我不知道怎麼去某行。

我的意思不是

SELECT * FROM $tbl_name WHERE id = $random_row 

因爲我的數據庫有ID列的差距,因此有時會失敗。

有沒有人得到一個腳本,可以從一個MySQL數據庫的隨機結果沒有答覆的ID和超級快? (該數據庫包含大約20000行)

+0

只需添加,這是用於高流量的網站,所以速度很重要。 – Adam 2012-04-21 20:23:28

+0

經過一些搜索,雖然在鏈接Adi發送的評論,我找到了一個體面的解決方案。 SELECT * FROM $ tbl_name T JOIN(SELECT CEIL(MAX(ID)* RAND())AS ID FROM $ tbl_name)AS x ON T.ID> = x.ID LIMIT 1; 來源:http://wanderr.com/jay/order-by-slow/2008/01/30/ 似乎是非常快速和非常隨機! – Adam 2012-04-21 20:52:25

+0

'//獲取數據庫中的行數量 - 事實上,您選擇的不是金額,而是選擇了包含此查詢的所有行。去圖 – 2012-04-29 05:32:35

回答

0

經過一番搜索,雖然阿迪發送鏈路上的評論,我已經找到了一個體面的解決辦法。

SELECT * FROM $tbl_name T JOIN (SELECT CEIL(MAX(ID)*RAND()) AS ID FROM $tbl_name) AS x ON T.ID >= x.ID LIMIT 1; 

來源:wanderr.com/jay/order-by-slow/2008/01/30

似乎是非常快和非常隨機的!

+0

所以,它比rand()的順序更隨機? – 2012-04-28 13:42:39

+0

是的,當使用rand()時,它返回的結果更接近0,並且我每10個查詢就收到相同的結果。 – Adam 2012-04-28 16:40:34

+0

它使用相同的rand()函數。看起來你錯在這裏了 – 2012-04-29 05:31:34

4
SELECT * FROM $tbl_name WHERE 1 ORDER BY RAND() LIMIT 1; 

20,000行不是那麼多,上面應該足夠快。

+0

我已經嘗試過你的查詢,它的工作原理,但似乎不是很隨機,我得到的結果每10個左右查詢。 – Adam 2012-04-21 20:25:48

1

Juhana是對的書:「秩序蘭德()限制1」,當然20k不是那麼多。 其他選項將與子查詢: SELECT [領域] FROM myTable的, (SELECT FLOOR(MAX(myTable.id)* RAND())AS RANDID FROM myTable的)AS someRandId WHERE myTable.id = someRandId.randId

討論here (請避免選擇*當它`不要)