2012-12-07 106 views
1

我試圖從我的表中顯示一個隨機記錄,但沒有運氣,這是我所要做的。這是編碼在PHP顯示隨機mysql記錄 - PHP

$range_result = mysql_query("SELECT MAX() AS max_id , MIN() AS min_id FROM pages"); 
$range_row = mysql_fetch_object($range_result); 
$random = mt_rand($range_row->min_id , $range_row->max_id); 
$result_random = mysql_query("SELECT * FROM pages WHERE id >= $random LIMIT 0,1"); 
echo $result_random; 

想知道這是否是一個明顯的錯誤?我已經連接到數據庫了。

JB

+0

您可以嘗試添加「按RAND()排序」,但是這是已知的,要求服務器進行更多的處理。 –

+0

http://stackoverflow.com/questions/1244555/how-can-i-optimize-mysqls-order-by-rand-function –

+0

使用mysql_query的返回值和mysql_error() –

回答

5

你應該直接的SQL這樣做有mysqli_multi_query性能:

// First query gets the random ID, second gets the associated row 
$sql = "SELECT @id:=FLOOR(RAND()*(MAX(id) - MIN(id))) + MIN(id) FROM pages; 
     SELECT * FROM pages WHERE id = @id;" 

// Create a mysqli object and execute the multi-query 
$mysqli = new mysqli($host, $user, $pass, $db_name); 
$mysqli->multi_query($sql); 
$result = $mysqli->store_result(); 

// Grab the first row from the first resultset 
if ($row = $result->fetch_assoc()) { 
    print_r($row); 
} 
+0

爲什麼討厭?這是一個很好的解決方案! –

+1

我認爲downvote來自於具有mysql_函數中的WHERE ORDER BY的初始文章。不知道雖然 –

+0

很確定WHERE ORDER BY會導致錯誤,並且mysql_總是在本站點受到攻擊。只是說...不是我。 –

1

你爲什麼不只是使用蘭特():

"SELECT * FROM pages ORDER BY RAND() Limit 1" 

但是,爲了回答,什麼是MIN和MAX選擇。如果沒有定義?你應該嘗試:

"SELECT MAX(`id`) AS max_id , MIN(`id`) AS min_id FROM pages" 

而且我不認爲你需要在極限的偏移量。所以只有極限1可能會很好。

作爲註釋狀態,對於較大的數據集,RAND()可能會很慢,但在很多情況下這不是問題,並且滯後極小,除非您擁有特殊數量的數據。閱讀弗蘭克的鏈接以查看詳細信息。但個人而言,我從來沒有真正遇到RAND()速度問題。正如Michael所說,你應該試着在迴應你認爲是結果集的東西之前取回結果。

而且,mysql_函數已被棄用。您應該切換到mysqliPDO

+1

http:// www檢查sql錯誤。 webtrenches.com/post.cfm/avoid-rand-in-mysql –

+1

只適用於小數據集 – 2012-12-07 00:41:01

+0

+1因爲'ORDER BY RAND()'是許多應用程序的簡單工作解決方案,其中沒有大表。 –

0

儘管你會通過RAND()好得多排序,你的方法是可行的。你的問題是你試圖回顯一個MySQL結果集。您需要在您的代碼後執行以下操作:

$row = mysql_fetch_assoc($result_random); 
echo $row['field1'] . " " . $row['field2']; 

其中field1和field2是表中列的名稱。