先看官方给出的方法:
先用php随机出信息ID,然后SQL调用用id in (php随机的ID列表),代码如下:
<?php
$randnum=10; //随机数量
$randids='';
$randdh='';
for($i=1;$i<=$randnum;$i++)
{
$randids.=$randdh.rand(1,100000); //1为最小ID,100000为最大ID
$randdh=',';
}
?>
[e:loop={栏目ID,显示条数,操作类型,只显示有标题图片,"id in ($randids)"}]
模板代码内容
[/e:loop]
但是,如果id不连续的话,可能出现调用悲剧。
以下改进的方法,看似复杂,感觉笨戳,实际执行结果却意外高效可靠:
<?php
$str="";
$rid=array();
$i=0;
while($i<10){
$nr= $empire->fetch1($sql);
$titleurl=sys_ReturnBqTitleLink($nr);
if(in_array($nr['id'], $rid)){
} else {
$str=$str."<li><a href='".$titleurl."' title='".$nr['title']."'>".$nr['title']."</a></li> ";
$rid[]=$nr['id'];
$i=$i+1;
}
}
echo $str;
?>
上述代码,随机调用10条信息,执行速度杠杠的,完全打破了随机调用耗时轻易别用的禁区。
特别注意下,t2的id重命名为id2是必须的,否则当表的id不连续的时候,会重蹈官方方法的覆辙。
同理,随机调用tagid的重点代码为:
SELECT *
FROM `phome_enewstags` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(tagid) FROM `phome_enewstags`)-(SELECT MIN(tagid) FROM `phome_enewstags`))+(SELECT MIN(tagid) FROM `phome_enewstags`)) AS tagid2) AS t2
WHERE t1.tagid >= t2.tagid2
ORDER BY t1.tagid limit 1
|