今天我们来谈谈信息随机调用的问题。我们在使用帝国CMS建站的时候,很多情况是需要随机的抽取一定数量的信息来展示给用户,那么大家一定会想到ORDER BY RAND()函数,使用这个函数
今天我们来谈谈信息随机调用的问题。我们在使用帝国CMS建站的时候,很多情况是需要随机的抽取一定数量的信息来展示给用户,那么大家一定会想到ORDER BY RAND()函数,使用这个函数可以帮我们实现随机调用信息的效果,可是问题来了?这样做会大量消耗你的服务器资源,并且生成速度也会很忙。如果你的数据表达到1万以上的数据,效果就会更明显了。
经过q935892722 君的测试结果为:使用ORDER BY RAND()函数生成100篇需要10~15秒,看到这样的速度你还敢使用吗?
那么有没有一个比较高效的办法呢?回答是肯定的,思路如下:
先用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]
这样的调用方式大概为每秒100篇,许多小白看到这里,相信很多人就像是在沙漠里遇到了水源,迫不及待的复制上面的代码去使用了。可是你们会发现有如下几个问题:
调用的结果跟自己想象的不一样,时多时少,有的时候一条都调用不出来,但是数据库里明明是有信息的。
造成这样的问题,小编总结了一下,具体为:
你的数据表内ID号出现断隔,比如说:1,2,4,6,8,9,10,这样你的3,5,7信息是测试的垃圾信息被你从数据表里删除了,而PHP随机出来的ID号又碰巧是3,5,7这些ID,所以会出现调用数量少的问题。
那么这又该如何解决呢?具体方案如下:
第一步:增大$randnum随机数量的值,比如原来你写的是10,你现在就改为100,或者200,这样随机出来的ID号很多就会在你的数据表里存在,那么存在,程序就会调用出来。
第二步:限制显示条数的数量,代码如下:
<?php$randnum=100;//随机数量$randids='';$randdh='';for ($i=1;$i<=$randnum;$i++){ $randids.=$randdh.rand(1,100000);//1为最小ID,100000为最大ID $randdh=',';}?>[e:loop={栏目ID,10,操作类型,只显示有标题图片,"id in ($randids)"}]模板代码内容[/e:loop]
就是修改上面红色代码当中的两个值,就能达到你想要的效果。
最后小白们可能会问,这是什么原理呢?其实原理也很简单。程序运行的流程大致是这样的
1、程序先从数据表(比如说:10000条)里按你给的随机ID号(比如说:11,25,28,33,60,55,41,78,100)把信息抽取出来,这个时候,你数据表里,可能ID为(25,28)的数据已经删除,那么真实的数据是(11,33,60,55,41,78,100),我们只是从这7条数据里抽取5条,那么结果数就是我们想到的了。
好了,总体过程就是这样,有不理解的留言吧!