连续ID下随机显示帖子已经实现,但不连续ID下,比如网站有多个版块,想在某个版块中随机取一个帖子,却想不出如何实现(id是不连续的)。。。
曾想先获取版块帖子总数量S,然后在0-S区间,取一个随机数。然后给查询结果加上行号,用行号=随机数S做为条件,再取出帖子的ID。
因为我还想在页面上加前一个,后一个(是同一版块的上一个帖子和下一个帖子,id是可能不连续的),这个我原来想,想随机取一个帖子ID,然后取条件大于此ID的本版块帖子,然后取三条,第一条作为前一个,第二个做为当前显示ID,第三个作为下一个。
这样第一次随机取没问题,但如果想显示特写ID的帖子,按上述方法就得读两次:1,读>当前ID的本版帖子,取第一个做为下一个。2,读<当前ID的帖子,倒序排列,可以取第一条作为前一个。但这样又有点太繁琐了,还会增加网站读取量,耗费性能。
但实验证明,这个根本不用担心,用行号加随机数做为条件,是无法取出记录,可能是因为执行时生成的虚拟行号,好像加条件时只能加小于某个行号的条件,不能加大于条件,也不能加等于条件,如下语句:
--加小于条件:rownum<随机数S select @rownum:=@rownum+1 as rownum,tid from hy_thread,(select @rownum:=0) a where fid=181 and @rownum<5 --5条,没问题 --加大于条件:rownum>随机数S,无法取到记录 select @rownum:=@rownum+1 as rownum,tid from hy_thread,(select @rownum:=0) a where fid=181 and @rownum>5 --0条, --加等于条件:rownum=随机数S,也无法取到记录,无论正序还是倒序 select @rownum:=@rownum+1 as rownum,tid from hy_thread,(select @rownum:=0) a where fid=181 and @rownum=5 order by tid desc --0
后来zwk网友指点:从数据库读一下有哪些帖子,tid放数组里,再array_rand,这样就可以取到一个随机帖子了。
很感谢这位朋友的指点,这样倒是简单了,基础知识太差,用的方法太笨拙了!
但这样取的话,前后iD估计就更难取到了。
+++
后来又一想,其实用户关心的可能更多的是前一个,可能有回看的需要,下一个可能不怎么需要。这样就好像简单了。
//页面设三个参数: p-前一个ID,pervious c-当前ID,current n-下一个ID,next +++ //--用户第一次访问: 随机显示帖子,pcn都为空, 不显示【前一个】链接(p参数=空) 取得当前ID,在【后一个】链接中增加参数p=当前随机ID。 //--用户点击【后一个】后: 随机显示帖子,cn为空,p=前一个ID。 显示【前一个】链接并添加取得的c=p参数(前页显示的ID),并添加n=当前随机ID(意思是点击前一个时,取到的p参数前一个ID,作为当前ID处理,n参数做为后一个ID处理。 取得随机ID,在【后一个】链接中增加参数p=currID。 ... 有点乱,要晕了 +++ 从页面处理来说可能更好一点: //C参数处理: 如果有C参数,作为当前ID直接显示 如果没有C参数,随机取当前ID并显示, 并在【后一个】链接中添加p=当前id(显示新页面后可以回看此ID)。 //P参数处理 如果有P参数,显示【前一个】链接,并在链接中设参数c=p参数ID,同时设定n=当前参数 如果没有P参数,不显示【前一个】链接 //N参数处理 如果有N参数,在【后一个】链接中设定参数c=N参数ID,如果无N参数,不处理。同时添加P=当前ID,同C参数处理。 //这样就差不多了。。。
好乱,有点晕。
No Tags