我想從數據庫中顯示一個隨機記錄。如果我選擇,我希望能夠顯示X個隨機記錄。因此,我需要從隨機選擇的ID列表中選擇最前面的X條記錄。從MySQL中選擇可變數量的隨機記錄
(除非地球大小顯着增加,否則將不會有超過500條記錄可供選擇,目前有66條可能。)
此功能可以使用,但我怎樣才能讓它變得更好?
/***************************************************/
/* RandomSite */
//****************/
// Returns an array of random site IDs or NULL
/***************************************************/
function RandomSite($intNumberofSites = 1) {
$arrOutput = NULL;
//open the database
GetDatabaseConnection('dev');
//inefficient
//$strSQL = "SELECT id FROM site_info WHERE major <> 0 ORDER BY RAND() LIMIT ".$intNumberofSites.";";
//Not wonderfully random
//$strSQL = "SELECT id FROM site_info WHERE major <> 0 AND id >= (SELECT FLOOR(COUNT(*) * RAND()) FROM site_info) ORDER BY id LIMIT ".$intNumberofSites.";";
//Manual selection from available pool of candidates ?? Can I do this better ??
$strSQL = "SELECT id FROM site_info WHERE major <> 0;";
if (is_numeric($intNumberofSites))
{
//excute my query
$result = @mysql_query($strSQL);
$i=-1;
//create an array I can work with ?? Can I do this better ??
while ($row = mysql_fetch_array($result, MYSQL_NUM))
{
$arrResult[$i++] = $row[0];
}
//mix them up
shuffle($arrResult);
//take the first X number of results ?? Can I do this better ??
for ($i=0;$i<$intNumberofSites;$i++)
{
$arrOutput[$i] = $arrResult[$i];
}
}
return $arrOutput;
}
更新問題: 我知道的ORDER BY RAND(),我只是不想使用它,因爲有傳言它不是在縮放和性能最好的。我對我的代碼過度批評。我有作品,ORDER BY RAND()的作品,但我可以做得更好嗎?
更新更新 ID中有空洞。沒有大量的流失,但發生的任何流失都需要我們團隊的批准,因此可以處理以緩存任何緩存。
感謝您的回覆!
如果只有以往任何時候都爲至多500然後整理蘭特()是足夠快。 – 2009-02-17 21:20:24
同意JPunyon關於預優化和給定最多500條記錄,一個不同的解決方案將會變得多快,並且是當前緩慢的函數? – 2009-02-17 21:47:20