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

  其实这个问题很简单,后来经过我们主管给我们稍微一指点,瞬间觉得高大尚啊,自己咋就没想到呢?还是太年轻啊!实现原理就是通过当前资讯信息的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

  好了,给大家看看效果.

  

  然后查询前8条看看.

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

  查询结果:

  

  额,好像不对啊!当前资讯内容页的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!  

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

  1. dedecms文章页调用上一篇和下一篇文章

    dedecms文章页调用上一篇和下一篇文章,解析后是链接形式的上下篇 {dede:prenext get='pre'/} {dede:prenext get='next'/}

  2. PHP实现上一篇、下一篇

    //php实现上一篇.下一篇 获取当前浏览文章id $id = isset($_GET[ ? intval($_GET['id']) : ""; 下一篇文章 $query = my ...

  3. onethink文章详情如何做上一篇和下一篇!

    其实很简单,如果要做上一篇和下一篇,只要知道当前文章ID的前一个ID和后一个ID即可: //上一篇文章 $prewhere = array(); $prewhere['id'] = array('LT ...

  4. 鲜为人知帝国CMS内容页调用上一篇和下一篇的精华方法汇总

    <span style="float:left">上一篇:[!--info.pre--]</span><span style="float: ...

  5. WordPress用键盘左右方向键来查看上一篇和下一篇文章

    通过键盘来查看上下篇文章是不是很方便,这个其实就是条用键盘所对应的ASCII码来实现的,比如左右方向键所对应的ASCII码就是37和39,下面来看看实现怎么实现这个功能: 1.加载jQury库,当然很 ...

  6. thinkphp5实现文章上一篇,下一篇

    写在控制器 //列表是按照根据id降序排列的,所以上一篇 $prv=Db::table('qy_article')->where('at_id','>',$at_id)->where ...

  7. PHPCMS 实现上一篇、下一篇

    方法一:直接调用phpcms系统的函数 <div class="info"> <span>上一篇:<a href="{$previous_p ...

  8. thinkphp3.2 实现上一篇和下一篇

    现在在做一个能够在内容页点击上一篇可以看到上一篇,点击下一篇可以看到下一篇. 首先http://www.mmkb.com/zhendao/index/news_show?code=98 现在code= ...

  9. phpcms v9 wap手机门户站点内容页添加上一篇、下一篇的方法

    PHP源码修改:打开 phpcms\modules\wap\index.php 文件找到if(!$r || $r['status'] != 99) showmessage(L('info_does_n ...

随机推荐

  1. 如何运行spring项目,并打成jar包进行发布

    一.创建spring项目 1.创建项目 2.创建moudule,选择java类型即可. 3.创建lib文件,引入spring的4个核心包spring-beans.spring-context.spri ...

  2. [置顶网]POWER 9为云与智能打造强大引擎

    POWER 9为云与智能打造强大引擎 关键字: 浪潮商用机器 POWER9 至顶网服务器频道 (文/董培欣): 从全球角度看,政治经济波动持续.逆全球化趋势抬头.技术加速变革商业等因素促使企业需要数字 ...

  3. DELPHI动态创建窗体

    //第一种方式 procedure TForm1.btn1Click(Sender: TObject); begin With TForm2.Create(Application) do Try Sh ...

  4. MySQL5.7 的编译安装

    转: 5.7的安装: https://www.insp.top/article/make-install-mysql-5-7 5.6的安装: https://www.chenyudong.com/ar ...

  5. idea和eclipse的区别

    使用基于IntelliJ的IDE,都会对project和module的关系比较糊涂.用简单的一句话来概括是: IntelliJ系中的Project相当于Eclipse系中的workspace.Inte ...

  6. 【arc074e】RGB Sequence(动态规划)

    [arc074e]RGB Sequence(动态规划) 题面 atcoder 洛谷 翻译见洛谷 题解 直接考虑暴力\(dp\),设\(f[i][j][k][l]\)表示当前考虑到第\(i\)位,最后一 ...

  7. ASP.NET MVC项目框架快速搭建实战

    MVC项目搭建笔记---- 项目框架采用ASP.NET MVC+Entity Framwork+Spring.Net等技术搭建,采用”Domain Model as View Model“的MVC开发 ...

  8. Request URI Too Long

    如上图所示,URL传參长度限制,改为Post参数提交就好了.

  9. Qt ------ WAV 音频文件介绍

    summary: wav 文件是有文件头的,播放时我们需要跳过文件头,否则开始播放有一小段时间的噪音,具体做法是:1.读取文件 2.读取位置指到文件头之后即可. 在资源交换文件RIFF标准中,所有的数 ...

  10. Hadoop基础-常见异常剖析之防坑小技巧

    Hadoop基础-常见异常剖析之防坑小技巧 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.