本文关键字词:自定义伪静态,栏目目录伪静态,内容目录伪静态,帝国cms伪静态,SEO栏目优化......
2023-05-18 179
随机调用帝国cms指定栏目下的几条信息,简单的使用order by rand()效率低下。官方给出的方法没有考虑id不连续的情况,这里为您介绍改进后的方法
自然的代码
看代码:
[e:loop={'select * from phome_ecms_news order by rand() limit 10',0,24}]
<a href="<?=$bqsr['titleurl']?>" target="_blank"><?=$bqr['title']?></a>
[/e:loop]
这是用灵动标签调用的帝国新闻数据表中随机的10条信息。然而order by rand() 在mysql中,是出名的效率低下。十万以上的数据,用这个调用,耗费的时间无法忍受。
2官方的代码
== 开始==
发个比较高效的随机调用方法
看不少人喜欢用ORDER BY RAND()随机调用,随机调用是最耗资源的一种调用方式,信息数在1万以上随机调用就开始影响速度。使用时建议慎之又慎。如果确实要使用,可以用下面思路:
先用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不连续,则随机函数ran命中的id可能不存在。有人要问了,id是自增字段,怎么会不连续呢?
有两种情况会导致id不连续。其一是,文章删除后;其二,要考虑指定栏目下的信息随机调用,这自然是无法保障id的连续。
3
进化后的代码
<?php
$classid=18;//指定栏目id,当前为$navclassid,多个请用分号隔开,比如'1,10'表示调用栏目1和10下的所有终极栏目
$limit=7;//七条
$tbname='news';//数据表
list(,$classids)=sys_ReturnMoreClass($classid,1);
$ids=$empire->gettotal("selectgroup_concat(id)astotalfrom{$dbtbpre}ecms_{$tbname}where$classids");
$idsr=explode(',',$ids);
$max=count($idsr)-1;
if($max<$limit-1){
$rand=implode(',',$idsr);
}else{
$ids=array();$i=0;
while($i<$limit){
$key=rand(0,$max);
if(array_key_exists($key,$ids))continue;
$ids[$key]=$idsr[$key];$i ;}
$rand=implode(',',$ids);
}?>
[e:loop={"select*from{$dbtbpre}ecms_{$tbname}whereidin($rand)limit$limit",0,24}]
<ahref="<?=$bqsr['titleurl']?>"><?=$bqr[title]?></a>
[/e:loop]
4给你点解释
这个代码经过实验证明,是高效和健壮的。
group_concat() ,是mysql中的字段函数,我们利用他取出了指定栏目下所有符合条件的id,这些id可能是不连续的。
用数组,把这些id映射为一个连续的自然数集,然后再随机,大功告成。
以上方法由办公区教程网编辑摘抄自百度经验可供大家参考!
标签:
相关文章
本文关键字词:自定义伪静态,栏目目录伪静态,内容目录伪静态,帝国cms伪静态,SEO栏目优化......
2023-05-18 179