我想从数据库中显示一个随机记录。如果我选择,我希望能够显示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