MySql中查询语句实现分页功能,其中pageNow代表当前是第几页

MySql中查询语句实现分页功能,其中pageNow代表当前是第几页,第1张

pageNow代表当前页面,第一页。

第一部分:看一下分页的基本原理:

对上面的mysql语句说明:limit 10000,20的意思扫描满足条件的10020行,扔掉前面的10000行,返回最后的20行,问题就在这里,如果是limit 100000,100,需要扫描100100行,在一个高并发的应用里,每次查询需要扫描超过10W行,性能肯定大打折扣。文中还提到limit n性能是没问题的,因为只扫描n行。

第二部分:根据雅虎的几位工程师带来了一篇Efficient Pagination Using MySQL的报告内容扩展:在文中提到一种clue的做法,给翻页提供一些线索,比如还是SELECT FROM message ORDER BY id DESC,按id降序分页,每页20条,当前是第10页,当前页条目id最大的是1020,最小的是1000,如果我们只提供上一页、下一页这样的跳转(不提供到第N页的跳转),那么在处理上一页的时候SQL语句可以是:

处理下一页的时候SQL语句可以是:

不管翻多少页,每次查询只扫描20行。

缺点是只能提供上一页、下一页的链接形式,但是我们的产品经理非常喜欢“上一页 1 2 3 4 5 6 7 8 9 下一页”这样的链接方式,怎么办呢?

如果LIMIT m,n不可避免的话,要优化效率,只有尽可能的让m小一下,我们扩展前面的clue做法,还是SELECT FROM message ORDER BY id DESC,按id降序分页,每页20条,当前是第10页,当前页条目id最大的是2519,最小的是2500;

当是第10页的SQL如下:

比如要跳到第9页,SQL语句可以这样写:

比如要跳到第8页,SQL语句可以这样写:

原理还是一样,记录住当前页id的最大值和最小值,计算跳转页面和当前页相对偏移,由于页面相近,这个偏移量不会很大,这样的话m值相对较小,大大减少扫描的行数。其实传统的limit m,n,相对的偏移一直是第一页,这样的话越翻到后面,效率越差,而上面给出的方法就没有这样的问题。

针对查询语句做处理,同时对请求页面地址做分析

listaspxpageid=5 //表示访问第五页

后台语言里,先对查询条件做预处理

pagepre=pagesize4 //pagesize 用于表示分页大小,例如10,则前4页共有40条记录

查询语句

sqlcmd="select top "+pagesize+" from tabelname where id not in (select top "+pagepre+" from tablename order by id desc)"

*** 作原理为将当前页前显示的所有记录从数据查询结果中排除,也就是not in 后面的部分,然后从剩余的结果冲,读取pagesize大小的记录值。筛选条件、排序条件放在子查询中

分页查询就是 比如 数据库是 30条数据 你每次查询10条出来select to 10 from 表 查询 10条 点 下一页的话就是 查询出 1到10的数据select to 20 from 表 where id not in (select to 10 id from 表) 查询出 查询出 11到20的数据一次类推

select from(

select columnName1,columnName2,

ROW_NUMBER() OVER (ORDER BY columnName) AS rowno

from

tableName

) as e

where rowno between 1 and 30

(select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc)

里面的这句应该好理解,就是 20 = (当前页 + 1) 每页记录数, 当前所有的记录数 这是没有分页的情况

select top 10 b from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,

就是从查出来的结果中,在查询前10条,在子语句查询的结果是倒排序的,所以,这个查的是上一页没有的情况下,是这样分页的

这样的话,一般不会出现页数不满的情况,在最后页和倒数第二页可能会出现数据重复情况

两个的排序字段一个是 desc 一个是asc 这样的

一个不带limit 一个带limit。以php+mysql为例首先,连接数据库,写一条sql语句把你要查询的信息总量查找出来sql = select count() from tb,$all_page ;设定每页显示条数, $display 。然后,当前页为$page ;在写一句sql = select from tb limit $dispaly($page - 1),$display;最后,在页面显示分页信息把当前页传回给分页处理页,一定要把相关的条件一起传回去,get 方式传值,否则查询条件改变查询信息就不正确。 网上有好多封装好的分页类。我也有一个很好用的分页类,如果请我吃肉就发给你一份哈。。\(^o^)/~ 追问: 这个$all_page用在哪儿,怎么将当前页传回给分页处理页。显示的时候那些“首页”“上一页”“下一页”“末页”是链接吗、链到什么地方,还是别的什么 回答: $all_page是查询总数,总是页数等于查询总数除以每页显示的信息。$num_page = ceil($all_page/$display); 用get方式把当前页传给分页处理页,就是<a href = "连接到本页或着不写也就是当前页?page=当前页码"></a>标签 别的我也想不起来,让我自己写分页,我只会最简单的那种,一般我都是调用一个现成的分页类。只需传个参数就Ok,连样式都不用写的。。。

方法1:

适用于 SQL Server 2000/2005

SELECT TOP 页大小

FROM table1

WHERE id NOT IN

(

SELECT TOP 页大小(页数-1) id FROM table1 ORDER BY id

)

ORDER BY id

方法2:

适用于 SQL Server 2000/2005

SELECT TOP 页大小

FROM table1

WHERE id >

(

SELECT ISNULL(MAX(id),0)

FROM

(

SELECT TOP 页大小(页数-1) id FROM table1 ORDER BY id

) A

)

ORDER BY id

方法3:

适用于 SQL Server 2005

SELECT TOP 页大小

FROM

(

SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber, FROM table1

) A

WHERE RowNumber > 页大小(页数-1)

以上就是关于MySql中查询语句实现分页功能,其中pageNow代表当前是第几页全部的内容,包括:MySql中查询语句实现分页功能,其中pageNow代表当前是第几页、查询数据库时,如何有效实现分页、Access的SQL查询分页语句是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9353064.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存