经典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冲刺总结及后诸葛亮报告(附团队贡献分)
眨眼就完结了第一阶段的冲刺了,之前因为学校停电停水等诸多原因而导致冲刺完毕时间的推迟. 第一阶段总体是做到了运算的功能,只是一些基本的功能实现,但能保证的容错性能较高. 1.在普遍的四则运算中都能见到 ...
- ubuntu18.04配置nvidia docker和远程连接ssh+远程桌面连接(三)
ubuntu18.04配置nvidia docker和远程连接ssh+远程桌面连接(三) 本教程适用于想要在远程服务器上配置docker图形界面用于深度学习的用户. (三)配置远程桌面连接访问dock ...
- JMeter学习笔记——认识JMeter(1)
拿到一个自动化测试工具,我们第一步就应该了解它能提供我们哪方面的功能(最直接的方法就是从官网获取),接下来就是简单的对这个工具进行“功能测试”了,当然这里的功能测试不是让你找它存在的bug,而是让自己 ...
- jsonp 接口
一.请求接口 <script type="text/javascript" src="js/jquery.min.js"></script&g ...
- poj 2406 Power Strings(kmp应用)
题目链接:http://poj.org/problem?id=2406 题意:给出一个字符串s,求重复子串出现的最大次数. 分析:kmp的next[]数组的应用. 要求重复子串出现的最大次数,其实就是 ...
- C#快速删除bin和obj文件夹的方法
C#程序总会生成bin和obj文件夹,为了减小源码的大小,就有必要将这两个文件夹删除,于是想到用批处理文件来删除. 以下是批处理的代码: @echo offset nowPath=%cd%cd /cd ...
- c++11 静态断言
c++11 静态断言 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #includ ...
- 如何设置Java虚拟机JVM启动内存参数
Tomcat默认的Java虚拟机JVM启动内存参数大约只有64MB或者128MB,非常小,远远没有利用现在服务器的强大内存,所以要设置Java虚拟机JVM启动内存参数.具体设置方法为: Tomcat修 ...
- COCI 2018/2019 CONTEST #2 Solution
Problem1 Preokret 第一题一定不是什么难题. 第一个问题在读入的时候判断当前时间是不是在1440及以前就行 第二个问题考虑离线处理,由于每个时刻只能最多发生1个事件那么就弄个桶记录每一 ...
- c++并发编程之thread::join()和thread::detach()
thread::join(): 阻塞当前线程,直至 *this 所标识的线程完成其执行.*this 所标识的线程的完成同步于从 join() 的成功返回. 该方法简单暴力,主线程等待子进程期间什么都不 ...