经典sql-获取当前文章的上一篇和下一篇

我们在做资讯类的网站的时候,肯定会有这么一个需求,就是在资讯内容页的下方需要给出上一篇和下一篇资讯的链接。上次我一同事兼好友兼室友就遇到了这么一个需求,一开始我们都把问题想复杂了,先取的是符合条件的资讯信息集合,然后再找到当前这条资讯信息在集合中的索引,通过索引再找到他的上一篇资讯和下一篇资讯信息,这种做法确实是可以实现这个需求,但是一旦资讯信息的数量过大,很有可能因为这段代码导致整个资讯内容页半天都打不开,所以,必须得另辟蹊径。

其实这个问题很简单,后来经过我们主管给我们稍微一指点,瞬间觉得高大尚啊,自己咋就没想到呢?还是太年轻啊!实现原理就是通过当前资讯信息的Id去数据库查找出符合排序规则的上一条和下一条资讯信息,是不是超级简单?直接看代码吧!

当前资讯内容页的Id为62,专业类别Id为20.

select top 1 -1 as [Mark],[ID],[Title] from [ZiXun_Info] where [SubjectID]=20 and [ID]<62
union 
select top 1  1 as [Mark],[ID],[Title] from [ZiXun_Info] where [SubjectID]=20 and [ID]>62

好了,给大家看看效果.

o_资讯_有Bug

然后查询前8条看看.

select top 8 * from [ZiXun_Info] where [SubjectID]=20

查询结果:

资讯前8条,注意添加红色标记的部分.

额,好像不对啊!当前资讯内容页的Id为62,他的上一篇应该是ID等于61的那条信息才对啊!为什么是第一条呢?对了,sql默认是按ID升序排序的,所以ID小于62的第一条肯定就是55了,还得加上排序方式才行,上一篇应该按ID降序排序,下一篇默认按ID升序排序(小降大升)就行。

加了排序方式后的sql:

select top 1 -1 as [Sort],[ID],[Title] from (select top 1 [ID],[Title] from [ZiXun_Info] where [SubjectID]=20 and [ID]<62 order by [ID] desc) as tab_up  --上一篇按ID降序排列.
union
select top 1  1 as [Sort],[ID],[Title] from [ZiXun_Info] where [SubjectID]=20 and [ID]>62  --下一篇默认按ID升序排列即可.

执行结果图:

正确的上一篇和下一篇.

好了,经过一番波折之后,我们最终还是修成了正果,这里你可以把[Mark]换成一个你内容页用不到的字段来代替,这里我就用了[Sort]来代替,这样就不用更改业务Model了。

小结:不要把简单的问题复杂化,要学会把复杂的问题简单化,晓菜鸟,Fighting!

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 经典sql-获取当前文章的上一篇和下一篇

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址