2009-10-04 179 views
1

從一個表中隨機選擇記錄;我必須始終在PHP中設置一個臨時變量嗎?我需要一些幫助來選擇CodeIgniter模型中的隨機行,然後在每次查看我的主頁時在視圖中顯示三個不同的行。有沒有人有任何想法如何解決這個問題?提前致謝!用MySQL隨機選擇行

回答

2

我有這段代碼在生產中得到一個隨機報價。使用MySQL的RAND函數非常慢。即使在數據庫中有100個引號,我也注意到網站上的延遲時間。有了這個,就沒有任何滯後。

$result = mysql_query('SELECT COUNT(*) FROM quotes'); 
$count = mysql_fetch_row($result); 
$id = rand(1, $count[0]); 
$result = mysql_query("SELECT author, quote FROM quotes WHERE id=$id"); 
4

我會做這樣的事情:

SELECT * FROM table ORDER BY RAND() LIMIT 1; 

這將使數據以隨機順序,然後從該隨機順序只返回第一行。

5

如果你沒有一噸的行,你可以簡單地說:

SELECT * FROM myTable ORDER BY RAND() LIMIT 3; 

如果你有很多行,這會很慢,但對於較小的數據集它會正常工作。

正如Steve Michel在他的回答中提到的,這種方法對於大型表格可能會變得非常難看。他的建議是一個跳脫的好地方。如果你知道餐桌上的近似最大整數PK,你可以這樣做產生一個和你最大的PK值之間的隨機數,然後抓住隨機排一個在類似時間:

$q="SELECT * FROM table WHERE id >= {$myRandomValue}"; 
$row = $db->fetchOne($q); //or whatever CI's interface to grab a single is like 

當然,如果你需要3個隨機行,你會在這裏有三個查詢,但是因爲它們完全在PK上,它們會很快(而不是隨機化整個表)。

2

排序方式蘭特(大表)可以很如果桌子非常大,很貴。 MySQL需要構建一個臨時表並對其進行排序。如果您有主鍵,並且您知道表中有多少行,請使用LIMIT x,1獲取一個隨機行,其中x是您想要獲取的行的編號。