【发布时间】:2010-10-08 04:57:55
【问题描述】:
我想显示数据库中的随机记录。如果我选择,我希望能够显示 X 条随机记录。因此,我需要从随机选择的 ID 列表中选择前 X 条记录
(永远不会有超过 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() 作品,但我可以做得更好吗?
更多更新 身份证上有洞。没有大量的流失,但发生的任何流失都需要得到我们团队的批准,因此可以处理转储任何缓存。
感谢您的回复!
【问题讨论】:
-
如果最多只能有 500 个,那么 Rand() 的 Order 非常快。
-
同意 JPunyon 关于预优化的观点,并且鉴于最多有 500 条记录,不同的解决方案会快多少,当前的功能会那么慢吗?