经典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!  

时间: 2024-10-13 03:00:02

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

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

其实很简单,如果要做上一篇和下一篇,只要知道当前文章ID的前一个ID和后一个ID即可: //上一篇文章 $prewhere = array(); $prewhere['id'] = array('LT',$id); $pre = M('document')->where($prewhere)->field('id')->limit('1')->order('id desc')->select(); $pre = intval($pre['0']['id']); //下一篇文章

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

通过键盘来查看上下篇文章是不是很方便,这个其实就是条用键盘所对应的ASCII码来实现的,比如左右方向键所对应的ASCII码就是37和39,下面来看看实现怎么实现这个功能: 1.加载jQury库,当然很多主题自己就已经加载过了,如果没有的话自己添加一个就可以了,网上很多方法,这里我就不再说了. 2.将下面的代码加入到footer.php中的之前即可 1 <script>$(document).keydown(function(e){ if(e.keyCode==37){ var rnt = $(

ThinkPHP3.2中文章内容页的上一篇,下一篇功能,以及分类功能的实现

上一篇下一篇功能的实现 模型层:注意:数据表的ID应为自动递增的情况下 public function newsBeforeAfter($url,$id,$cate_id){ //上一篇 $where=array(); $where['checks']=array('eq',1);//该条内容是否审核 $where['id']=array('lt',$id);//上一篇ID应该小于当前接收到的ID $where['cate_id']=array('eq',$cate_id);//分类ID $fr

DEDECMS文章模板的上一篇、下一篇的链接地址

需要修改 /include/arc.archives.class.php (默认) 搜索 GetPreNext(  或 上一篇 找到 GetPreNext()函数 在 $this->PreNext['pre'] = "上一篇:<a href='$mlink'>{$preRow['title']}</a> $isurl";增加一行 $this->PreNext['preurl'] = $mlink; $this->PreNext['pre'] =

PHPCMS 实现上一篇、下一篇

方法一:直接调用phpcms系统的函数 <div class="info"> <span>上一篇:<a href="{$previous_page[url]}">{$previous_page[title]}</a></span> <span>下一篇:<a href="{$next_page[url]}">{$next_page[title]}</a>

超经典sql练习题,在teradata上实现

题目来源:https://blog.csdn.net/flycat296/article/details/63681089 teradata实现: drop table student; create table student( s_id varchar(10), sname varchar(20), sage date, sex varchar(20) ); insert into Student values('01' , '赵雷' ,'1990-01-01' , '男'); insert

获取当前周、上一周、下一周的日期

使用JS或者是JQuery获取当前周和上一周.下一周的日期时间信息的方法,摘自 http://www.qdfuns.com/notes/18184/435de54dd1e41baf6777039e394c0100.html,目的仅仅是为了做个笔记,侵删!以下是代码以及解析: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html > <head> <meta h

phpcms V9实现wap上一篇、下一篇功能

在phpcms\modules\wap\index.php里面,搜索上面这句 if(!$r || $r['status'] != 99) showmessage(L('info_does_not_exists'),'blank'); 找到后,在它的下一行添加上 //上一页 $previous_page = $this->db->get_one("`catid` = '$catid' AND `id`<'$id' AND `status`=99",'*','id DES

查询文章的上下篇Sql语句

本来觉得这个查询不用大动干戈的洋洋洒洒写一篇文章的:不过看到不少人在这栽跟头:还是简单总结下吧: 文章内容页一般都会有上一篇和下一篇的功能: 那么查询上下篇的sql语句应该怎么写呢: 示例数据表:bjy_article 自增主键:id 当前文章id:10 肯定会有童鞋是说,这简单啊id+1和id-1不就OK了:sql无非如下: SELECT * FROM bjy_article WHERE id=10-1:     #上一篇 SELECT * FROM bjy_article WHERE id=