经典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
好了,给大家看看效果.

然后查询前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-获取当前文章的上一篇和下一篇的更多相关文章
- dedecms文章页调用上一篇和下一篇文章
dedecms文章页调用上一篇和下一篇文章,解析后是链接形式的上下篇 {dede:prenext get='pre'/} {dede:prenext get='next'/}
- PHP实现上一篇、下一篇
//php实现上一篇.下一篇 获取当前浏览文章id $id = isset($_GET[ ? intval($_GET['id']) : ""; 下一篇文章 $query = my ...
- onethink文章详情如何做上一篇和下一篇!
其实很简单,如果要做上一篇和下一篇,只要知道当前文章ID的前一个ID和后一个ID即可: //上一篇文章 $prewhere = array(); $prewhere['id'] = array('LT ...
- 鲜为人知帝国CMS内容页调用上一篇和下一篇的精华方法汇总
<span style="float:left">上一篇:[!--info.pre--]</span><span style="float: ...
- WordPress用键盘左右方向键来查看上一篇和下一篇文章
通过键盘来查看上下篇文章是不是很方便,这个其实就是条用键盘所对应的ASCII码来实现的,比如左右方向键所对应的ASCII码就是37和39,下面来看看实现怎么实现这个功能: 1.加载jQury库,当然很 ...
- thinkphp5实现文章上一篇,下一篇
写在控制器 //列表是按照根据id降序排列的,所以上一篇 $prv=Db::table('qy_article')->where('at_id','>',$at_id)->where ...
- PHPCMS 实现上一篇、下一篇
方法一:直接调用phpcms系统的函数 <div class="info"> <span>上一篇:<a href="{$previous_p ...
- thinkphp3.2 实现上一篇和下一篇
现在在做一个能够在内容页点击上一篇可以看到上一篇,点击下一篇可以看到下一篇. 首先http://www.mmkb.com/zhendao/index/news_show?code=98 现在code= ...
- phpcms v9 wap手机门户站点内容页添加上一篇、下一篇的方法
PHP源码修改:打开 phpcms\modules\wap\index.php 文件找到if(!$r || $r['status'] != 99) showmessage(L('info_does_n ...
随机推荐
- 如何运行spring项目,并打成jar包进行发布
一.创建spring项目 1.创建项目 2.创建moudule,选择java类型即可. 3.创建lib文件,引入spring的4个核心包spring-beans.spring-context.spri ...
- [置顶网]POWER 9为云与智能打造强大引擎
POWER 9为云与智能打造强大引擎 关键字: 浪潮商用机器 POWER9 至顶网服务器频道 (文/董培欣): 从全球角度看,政治经济波动持续.逆全球化趋势抬头.技术加速变革商业等因素促使企业需要数字 ...
- DELPHI动态创建窗体
//第一种方式 procedure TForm1.btn1Click(Sender: TObject); begin With TForm2.Create(Application) do Try Sh ...
- MySQL5.7 的编译安装
转: 5.7的安装: https://www.insp.top/article/make-install-mysql-5-7 5.6的安装: https://www.chenyudong.com/ar ...
- idea和eclipse的区别
使用基于IntelliJ的IDE,都会对project和module的关系比较糊涂.用简单的一句话来概括是: IntelliJ系中的Project相当于Eclipse系中的workspace.Inte ...
- 【arc074e】RGB Sequence(动态规划)
[arc074e]RGB Sequence(动态规划) 题面 atcoder 洛谷 翻译见洛谷 题解 直接考虑暴力\(dp\),设\(f[i][j][k][l]\)表示当前考虑到第\(i\)位,最后一 ...
- ASP.NET MVC项目框架快速搭建实战
MVC项目搭建笔记---- 项目框架采用ASP.NET MVC+Entity Framwork+Spring.Net等技术搭建,采用”Domain Model as View Model“的MVC开发 ...
- Request URI Too Long
如上图所示,URL传參长度限制,改为Post参数提交就好了.
- Qt ------ WAV 音频文件介绍
summary: wav 文件是有文件头的,播放时我们需要跳过文件头,否则开始播放有一小段时间的噪音,具体做法是:1.读取文件 2.读取位置指到文件头之后即可. 在资源交换文件RIFF标准中,所有的数 ...
- Hadoop基础-常见异常剖析之防坑小技巧
Hadoop基础-常见异常剖析之防坑小技巧 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.