MySQl存储过程翻页查询

本文深入探讨了SQL分页查询的优化算法,通过解析SQL字符串,计算总记录数和总页数,并实现了合法的页码过滤。利用MySQL中的整除、取余数和四舍五入操作符,确保查询结果准确且高效。文章详细解释了如何在不合法的边界条件下调整页码,以及如何构建分页SQL查询语句。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#####################################################
#参数表
#1.sqlstr sql语句字符串
#2.pageNo 页码
#3.pageSize 页尺寸
#in sqlstr varchar(50),in pageNo int,in pageSize int
#####################################################


begin
#总页数
declare sqlstr_new varchar(100);
#传入SQL总长度
declare sqlLength int default 0;
#SQL关键字'from'的位置
declare keyWordFromPos int default 1;


#当前页码
set @currentPageNo=0;
#总页数
set @pageTotal=0;
#总记录数
set @records=0;
#转成小写字母SQL
set sqlstr_new=lcase(sqlstr);
#取得SQL总长度
set sqlLength=length(sqlstr);
#取得关键字'from'的位置
set keyWordFromPos=instr(sqlstr_new,'from');
#截取'from'之后的SQL
set @sub_sql_after_from = substr(sqlstr_new,keyWordFromPos,sqlLength);
#重建取记录总数SQL
set @rscount_sql=concat('select count(*) into @records' ,' ',@sub_sql_after_from);
#取得'from'之前的SQL
set @sub_sql_before_from= rtrim(ltrim(substr(sqlstr_new,1,keyWordFromPos-1)));
#重建查询SQL
set @pageSQL=concat(@sub_sql_before_from,',@currentPageNo,@pageTotal,@records',' ',@sub_sql_after_from);


#统计总记录数
prepare rsCount_pre from @rscount_sql;
execute rsCount_pre;
deallocate prepare rsCount_pre;


#分页
set @temp=@records%pageSize;
if @records<=pageSize then
set @pageTotal=1;
elseif @temp=0 then
set @pageTotal=@records div pageSize;
else
set @pageTotal=@records div pageSize+1;
end if;


#过滤不合法的边界,防止页码不合法
if pageNo>@pageTotal then
set pageNo=@pageTotal;
elseif pageNo<1 then
set pageNo=1;
end if;


#生成分页索引
set @currentPageNo=pageNo;
set @pageIndex=1;
set @pageIndex=pageSize*(pageNo-1);


#重组SQL
set @pageSQL=concat(@pageSQL,' ','limit',' ',@pageIndex,',',pageSize);


#查询结果
prepare pageExecute from @pageSQL;
execute pageExecute;
deallocate prepare pageExecute;


end


备注:

1.Mysql中的整除

 在Mysql中想用两个整数进行整除不能用"a/b" 而要用 a div b;

2.Mysql中的取余数(取模)

   要用 a mod b 或 a%b

3.Mysq中四舍五入

   round(1.5)

 结果为2


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值