create procedure `mysqltestuser_select_pageable`(
_whereclause varchar(2000), -- 查找条件
_orderby varchar(2000), -- 排序条件
_pagesize int , -- 每页记录数
_pageindex int , -- 当前页码
_docount bit -- 标志:统计数据/输出数据
)
not deterministic
sql security definer
comment ' '
begin
-- 定义key字段临时表
drop table if exists _temptable_keyid; -- 删除临时表,如果存在
create temporary table _temptable_keyid
(
userid int
)type=heap;-- 构建动态的sql,输出关键字key的id集合
-- 查找条件 set @sql = 'select userid from mysqltestuser ';
if (_whereclause is not null) and (_whereclause <> ' ') then
set @sql= concat(@sql, ' where ' ,_whereclause);
end if; if (_orderby is not null) and (_orderby <> ' ') then
set @sql= concat( @sql , ' order by ' , _orderby);
end if;
-- 准备id记录插入到临时表 set @sql=concat( 'insert into _temptable_keyid(userid) ', @sql);
prepare stmt from @sql;
execute stmt ;
deallocate prepare stmt; -- key的id集合 [end]-- 下面是输出 if (_docount=1) then -- 统计
begin
select count(*) as recordcount from _temptable_keyid;
end;
else -- 输出记录集
begin
-- 计算记录的起点位置
set @startpoint = ifnull((_pageindex-1)*_pagesize,0);
set @sql= ' select a.*
from mysqltestuser a
inner join _temptable_keyid b //这里使用inner join 来查询,意义在哪,提升效率了?怎样提升的?
on a.userid =b.userid '; set @sql=concat(@sql, " limit ",@startpoint, " , ",_pagesize);
prepare stmt from @sql;
execute stmt ;
deallocate prepare stmt;
end;
end if; drop table _temptable_keyid;
end;
下面是mysqltestuser表的ddl:create table `mysqltestuser` (
`userid` int(11) not null auto_increment,
`name` varchar(50) default null,
`chinesename` varchar(50) default null,
`registerdatetime` datetime default null,
`jf` decimal(20,2) default null,
`description` longtext,
primary key (`userid`)
) engine=innodb default charset=gb2312;
_whereclause varchar(2000), -- 查找条件
_orderby varchar(2000), -- 排序条件
_pagesize int , -- 每页记录数
_pageindex int , -- 当前页码
_docount bit -- 标志:统计数据/输出数据
)
not deterministic
sql security definer
comment ' '
begin
-- 定义key字段临时表
drop table if exists _temptable_keyid; -- 删除临时表,如果存在
create temporary table _temptable_keyid
(
userid int
)type=heap;-- 构建动态的sql,输出关键字key的id集合
-- 查找条件 set @sql = 'select userid from mysqltestuser ';
if (_whereclause is not null) and (_whereclause <> ' ') then
set @sql= concat(@sql, ' where ' ,_whereclause);
end if; if (_orderby is not null) and (_orderby <> ' ') then
set @sql= concat( @sql , ' order by ' , _orderby);
end if;
-- 准备id记录插入到临时表 set @sql=concat( 'insert into _temptable_keyid(userid) ', @sql);
prepare stmt from @sql;
execute stmt ;
deallocate prepare stmt; -- key的id集合 [end]-- 下面是输出 if (_docount=1) then -- 统计
begin
select count(*) as recordcount from _temptable_keyid;
end;
else -- 输出记录集
begin
-- 计算记录的起点位置
set @startpoint = ifnull((_pageindex-1)*_pagesize,0);
set @sql= ' select a.*
from mysqltestuser a
inner join _temptable_keyid b //这里使用inner join 来查询,意义在哪,提升效率了?怎样提升的?
on a.userid =b.userid '; set @sql=concat(@sql, " limit ",@startpoint, " , ",_pagesize);
prepare stmt from @sql;
execute stmt ;
deallocate prepare stmt;
end;
end if; drop table _temptable_keyid;
end;
下面是mysqltestuser表的ddl:create table `mysqltestuser` (
`userid` int(11) not null auto_increment,
`name` varchar(50) default null,
`chinesename` varchar(50) default null,
`registerdatetime` datetime default null,
`jf` decimal(20,2) default null,
`description` longtext,
primary key (`userid`)
) engine=innodb default charset=gb2312;
解决方案 »
- 新手求助:如何判断ABCD档,并送到指定的表中
- 求大侠帮我写一条sql语句啊,我想了半天了,求助
- 如何得到不在group by里也不用聚合函数的字段信息?应该不难
- 再求一个触发器
- Checking for corrupt, not cleanly closed and upgrade needing tables.
- 重金求数据库 mysql 的 一条sql查询语句
- 请问怎样判断使用什么索引
- 一个MYSQL查询优化的问题
- 关于SQL的事务和加锁的问题
- 请问:如何在delphi中编写能动态地更改mysql和sybase两种数据库的用户名和密码的程序??
- 跪求一Mysql存储过程???
- sql语句效率低下,高手帮忙看看
内连接中使用到了索引,效率比较高
只不过是整个程序中使用了临时的内存表,来暂存分页中的ID,然后再取以试图提高效率。但整个这个思路未必会获得速度上的增加。