[共享]我的高效mysql分页存储过程...
总是习惯了mssql上面的存储过程分页,然后结合AspNetPager分页控件(http://www.webdiyer.com/AspNetPager/default.aspx),这样就完成了记录的分页显示;
由于最近用到mysql,由于mssql,mysql两者的表达语法和语法约束上的区别,导致写起mysql上的分页版本有点“复杂”。经过查找一番资料后终于把它“复制”了。
存储过程分页的基本原理:我们先对查找到的记录集(支持输入查找条件_WhereClause和排列条件_OrderBy)的key字段临时存放到临时表,然后构建真正的记录集输出。
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
ON A.userid =B.userid &nb