原本以为这个查询不用大动干戈的洋洋洒洒写一篇文章的;不过看到很多人在这栽跟头;仍是简单总结下吧;sql
文章内容页通常都会有上一篇和下一篇的功能;code
那么查询上下篇的sql语句应该怎么写呢;资源
示例数据表:bjy_article博客
自增主键:idit
当前文章id:10
for循环
确定会有童鞋是说,这简单啊id+1和id-1不就OK了;sql无非以下:class
SELECT * FROM bjy_article WHERE id=10-1; #上一篇 SELECT * FROM bjy_article WHERE id=10+1; #下一篇
写出这2句sql后;大部分人稍加思索就会发现不妥;若是中间删除了几篇,那取到的值就成空了?sql语句
这时有人在一旁大喊;能够用for循环啊,再来个if直到不为空为止;循环
不经脑子的随便一想;貌似行得通;可是做为严谨的程序猿,认真思考这个不算方法的方法时候立马发现2个严重的问题;程序
1:我只是想取上一篇文章;结果来了个for查询了NNNN次,严重浪费资源;
2:假设如今一共10篇文章,第11篇就为空了,若是用for就会无限循环下去一直为空;
如此来讲;果断是不能这样写了;
这时又有人在一旁大喊;用limit不就能够了;
正解;
SELECT * FROM bjy_article WHERE id<10-1 LIMIT 1; #上一篇 SELECT * FROM bjy_article WHERE id>10+1 LIMIT 1; #下一篇
这就完了吗?NO;若是用这sql取;下一篇没问题了;可是上一篇会一直是第一篇文章!
这时来个倒序便可;
SELECT * FROM bjy_article WHERE id<10-1 LIMIT 1 ORDER BY id DESC; #上一篇