前言
在实践中我们会遇到这样的问题,知道某条记录的id,然后需要判断此条记录如果按照id进行排序分页,此条记录在第几页。今天这篇文章为大家提供一个思路。
下面话不多说了,来一起看看详细的实现方法吧
根据ID查询分页位置
根据ID来查询分页位置,比如按照ID的倒序排列,则可通过以下SQL查询出大于此ID记录数:
select count(id) from user where id > 5;
示例中user为表名,5位待匹配的id。很显然,因为是倒序排序只需查找大于此id的记录数即可,如果是正序排列,则小于此id即可。
当查出count值之后,怎么计算当前记录位于第几页呢,这里以java代码示例计算:
int pageSize = 10; // 假设上面查出的结果为count,值为11 int count = 11; // 计算当前记录所在的pageNum // 通过取模并加1获得当前页数为第2页 int pageNum = count/pageSize + 1; // 如果想进一步获得在某页的某个位置,则再进行取余即可,即第2页的第1条记录(从0开始) int index = count%pageSize;
多维度排序定位
上面通过简单的ID进行排序还是比较好解决的,那么如果现在查询某条记录排序的维度不仅仅是ID,比如先按照年龄(age)进行倒序排序,如果age相同,则再跟进ID进行倒序排序。基本的sql语句如下:
select id, age from user order by age desc,id desc;
此时我们知道某条id为5,age为18的记录,如何确定出此条记录在多条件排序中的位置呢。
首先,多条件排序的难度在于age相同的情况,如果age不相同,只需如下sql即可像《根据ID查询分页位置》一样定位出id的位置:
select count(id) from user where age > 18;
这样就可以查询出来此组合排序age不相同时此条记录的位置,具体位置的算法同第一种情况。
那么当age用重复的情况如何处理呢。当然,可以通过复杂的关联查询或子表查询来实现,这里通过另外一种方式,就是再查询一下age相同,并且id大于当前用户的记录条数:
select count(id) from user where age = 18 and id > 5;
上面获得了age相同情况下,并且id大于5的记录,将第一步和第二步的统计结果相加,问题是不是又回到了《根据ID查询分页位置》的简单模式了,还是同样的算法可以算出当前记录位于第几页了。
此种方案虽然查询了两次数据库,如果很好的建立索引,比关联查询或子查询要方便、简洁和高效一些。
小结
以上是在实践中遇到类似问题的两个思考维度,希望能给大家带来一个突破,同时也希望大家提供更好的方案。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对小牛知识库的支持。
问题内容: 我想从MySQL查询返回第二条,第三条或第四条记录(基于ID递增的查询) 问题是,我不知道ID,只是它是查询中的第三行。 问题答案: 它说从记录n开始返回一个记录。
问题内容: 我正在尝试获取“分组”记录的第一条记录和最后一条记录。 更准确地说,我正在执行这样的查询 但我想获得小组的第一和最后的记录。可以通过执行大量请求来完成,但是我的桌子很大。 是否有使用MySQL的方法(如果可能的话,可以减少处理时间)? 问题答案: 您要使用和: 这避免了昂贵的子查询,并且我发现对于这个特定问题它通常更有效。 请查阅手册中的两个函数以了解它们的参数,或访问本文,其中包含有
本文向大家介绍sql分页查询几种写法,包括了sql分页查询几种写法的使用技巧和注意事项,需要的朋友参考一下 关于SQL语句分页,网上也有很多,我贴一部分过来,并且总结自己已知的分页到下面,方便日后查阅 1.创建测试环境,(插入100万条数据大概耗时5分钟)。 2.几种典型的分页sql,下面例子是每页50条,198*50=9900,取第199页数据。 --写法1,not in/top --写法2,n
本文向大家介绍mysql、mssql及oracle分页查询方法详解,包括了mysql、mssql及oracle分页查询方法详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了mysql、mssql及oracle分页查询方法。分享给大家供大家参考。具体分析如下: 分页查询在web开发中是最常见的一种技术,最近在通过查资料,有一点自己的心得 一、mysql中的分页查询 注: pageNum是要
使用数据库的应用程序,多数情况下都需要使用 “分页” 这个功能。尤其是在 Web 应用程序中,后端的分页查询尤其的普遍。 在以往的使用经验中,一个分页查询,除了能获取到一个列表外,我们通常需要如下几个信息才能在客户端显示出一个完整的翻页条。 当前页数 -- 第几页 页大小 -- 每页有多少条记录 总页数 -- 一共多少页 总记录数 -- 如果不分页,一共有多少条记录 当我们获得了这四条信息后,对于
limt 分页查询 查询前3条记录 分页公式: (offset - 1) * limit SELECT name FROM `student` LIMIT 0, 3; Student.findAll( { attributes:['name'], // 当前页 offset:0, // 每页显示的条数 limit:3 }) 分页案例 router.ge