Allen 2020-06-06 19:50:30 5596 1 0 0 0

  连续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
相关内容
评论
Allen#1Allen 2020-06-06 23:55:55(N) 链接地址

刚查到的,取随机数据,原来有更简单的办法:

select tid from hy_thread where fid=181 order by rand() limit 1;

一条查询语句,一次查询就搞定了!

不过在数据库中排序,可能会影响性能较大。

顶部     1/1 
欢迎评论
未登录,
请先 [ 注册 ] or [ 登录 ]
(一分钟即可完成注册!)
返回首页     ·   返回[站点讨论]   ·   返回顶部