我想从数据库中显示一条随机记录.如果我选择,我希望能够显示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()有效,但我可以做得更好吗?
更多更新
ID中有漏洞.没有大量的流失,但任何流失都需要得到我们团队的批准,因此可以处理转储任何缓存.
谢谢你的回复!
解决方法:
为什么不在数据库查询中使用orderby中的Rand函数?那么你不必在代码中进行随机化等…
像(我不知道这是否合法)
Select *
from site_info
Order by Rand()
LIMIT N
其中N是您想要的记录数…
编辑
您是否已将您的代码与查询解决方案进行了分析?我想你只是在这里进行预优化.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。