mysql多条件排序取上一条下一条?

idsortaddtime
7999991669773210
8099991669737600
7899991669737600

我取到上面表用的sql是select * from news order by sort asc ,addtime desc,id desc

现在进到详情页,需要查一下当前数据的上一条数据和下一条。
以79为例,上一条无,下一条为80
以80为例,上一条是79,下一条是78
以78为例,上一条为80,下一条无

我在做到80的时候好像取数据就不对了,我以80这条数据的addtime作为条件去查的,怎么样能做到上面的查询结果。addtime可能相同,这个好像处理起来就比较麻烦一些

阅读 2.4k
3 个回答

你以id降序select的,那你查询的时候也得以id降序

where addtime <= #{addtime}
and id != #{id}
order by id desc
limit 1

我有个不怎么高效的办法,利用到 ROW_NUMBER() OVER ()

# 分成两个语句,首先根据id=80,查到对应的行数为2
SELECT row_num FROM (
    SELECT id,ROW_NUMBER() OVER () AS row_num FROM news ORDER BY sort ASC, addtime DESC, id DESC
) t WHERE t.id=80;

# 然后,如果需要查询前一条t.row_num=1,后一条t.row_num=3
SELECT * FROM (
    SELECT *,ROW_NUMBER() OVER () AS row_num FROM news ORDER BY sort ASC, addtime DESC, id DESC
) t WHERE t.row_num=3;

三个排序反转一下是不是可以? asc -> desc, desc -> asc

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题