前言
公司有一个网站tp框架,有一个新闻列表功能,新闻详情页有上一页,下一页功能。通过百度发现大部分都是采用如下解法:
SELECT * FROM news WHERE id < ? ORDER BY id DESC LIMIT 1
这确实不错,不过有一个尴尬的问题,如果文章列表是经过一个sort字段排序的呢?
会出现如下问题:
id是乱序的!显然这个方案是行不通的。
而公司框架更吓人!
显然这是可以实现的,不过文章数量达到1W+那就可想而知了。。。
解决方案:
还是以这个表为例!
下一篇,以当前id为1:
SELECT * FROM news WHERE (sort < 2 OR (sort = 2 AND id < 1)) ORDER BY sort DESC, id DESC LIMIT 1
上一篇,以当前id为2:
select * FROM news WHERE (sort > 0 OR (sort = 0 AND id > 2)) ORDER BY sort ASC, id ASC LIMIT 1
问题就这样解决了,sql有了,后端代码自行实现就好啦!
更新
关于sql优化问题,尽量不用 OR 的话可以用 UNION ALL 来代替
下一篇
(SELECT * FROM news WHERE sort < 2 ORDER BY sort DESC, id DESC LIMIT 1)
UNION ALL
(SELECT * FROM news WHERE sort = 2 AND id < 1 ORDER BY sort DESC, id DESC LIMIT 1)
LIMIT 1;
上一篇
(SELECT * FROM news WHERE sort > 0 ORDER BY sort ASC, id ASC LIMIT 1)
UNION ALL
(SELECT * FROM news WHERE sort =0 AND id > 2 ORDER BY sort ASC, id ASC LIMIT 1)
LIMIT 1;