存储过程中的分页,而不使用MySQL中的LIMIT和OFFSET。

时间:2015-10-26 06:21:28

标签: mysql pagination

我必须使用MySQL中的LIMIT为分页创建一个存储过程。它在我的本地数据库中运行良好,但它不能在服务器上运行。因此,我尝试在谷歌搜索并获得解决方案"在服务器上升级phpmyadmin版本" ,但这是不可能的。所以在没有LIMIT或OFFSET的情况下创建分页的任何替代方法。 ?

在我的代码下面,我试过了。

CREATE DEFINER=`root`@`localhost` PROCEDURE `LazyLoadScope`(IN ClientId INT,IN StartIndex INT,IN Count INT)
BEGIN

DECLARE LowerBound  INT;
DECLARE UpperBound  INT;
DECLARE rownum  INT;
SET LowerBound = ((StartIndex - 1) * Count) + 1;
SET UpperBound = ((StartIndex - 1) * Count) + Count;

SELECT scopeid,scopename,clientid,scope,createddate,ViewDate,IsLocked
FROM scopemaster as sm  inner join clientmaster cm on cm.clientid=sm.clientid
where cm.userid=ClientId order by sm.ViewDate desc LIMIT LowerBound,UpperBound ; 

END

1 个答案:

答案 0 :(得分:4)

@kaushik请尝试以下代码。

CREATE DEFINER=`root`@`localhost` PROCEDURE `LazyLoadScope`(IN ClientId    INT,IN StartIndex INT,IN Count INT)
BEGIN
DECLARE LowerBound INT;
DECLARE UpperBound INT;
DECLARE rownum INT;
SET LowerBound = ((StartIndex - 1) * Count) + 1;
SET UpperBound = ((StartIndex - 1) * Count) + Count;

SELECT scopeid,scopename,clientid,scope,createddate,ViewDate,IsLocked
  from (SELECT *, @rownum := @rownum + 1 AS rank 
  from (SELECT   sm.scopeid,sm.scopename,sm.clientid,sm.scope,sm.createddate,sm.ViewDate,sm.Is     Locked
FROM scopemaster as sm
inner join clientmaster cm on cm.clientid=sm.clientid
where cm.userid=ClientId order by sm.ViewDate desc) d, (SELECT @rownum  := 0) r ) m
WHERE rank >= LowerBound and rank <= UpperBound;

END