先看官方给出的方法:
先用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 $sql="SELECT * FROM {$dbtbpre}ecms_news AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM {$dbtbpre}ecms_news )-(SELECT MIN(id) FROM {$dbtbpre}ecms_news))+(SELECT MIN(id) FROM {$dbtbpre}ecms_news )) AS id2) AS t2 WHERE t1.id >= t2.id2 ORDER BY t1.id LIMIT 1"; $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
本文由网友投稿或聚码屋整理自网络,如转载请注明出处:https://www.ym3.net/2519.html;
本站发布的内容若侵犯到您的权益,请邮件联系 cnzz8#outlook.com 删除,我们将及时处理!
本站大部分下载资源收集于网络,不保证其完整性以及安全性,请下载后自行测试。
本站资源仅供学习和交流使用,版权归资源原作者所有,请在下载后24小时之内自觉删除。
若作商业用途,请购买正版,由于未及时购买和付费发生的侵权行为,与本站无关。
还没有评论,快来说点什么吧~