mysql 存储过程中 limit之后使用分页变量,传入分页参数. 类似于微博游标分批次获取信息;问号参数类似于c#的string.format;问号占位符

mysql 存储过程中 limit之后使用分页变量,传入分页参数. 在有的时候,我们需要自己手动来控制分页的变量,例如是10条分页,还是20条分页,这个时候limit之后的数字就是变量了


SET ssql="SELECT g.*,? as nextCursor FROM tmp_table_GetTeachnew g LIMIT ?,?";
SET @query=p_Next_Cursor;
SET @fvar=limitCount;
SET @svar=pageSize;
SET @SQUERY=ssql;
PREPARE STMT FROM @SQUERY;
EXECUTE STMT USING @query,@fvar,@svar;

这里不仅仅是 limit之后 使用了2个变量,而且在 from 之前 也使用了一个变量。

类似于微博游标分批次获取信息

有的时候,一次性拿100条数据是很夸张的(相对于安卓手机客户端来说),那么我们就需要分页一下,类似于一个游标,一次取10条或者20条数据,如果还有多的数据,则客户端点击更多,继续获取10条信息

DELIMITER $$

USE `data`$$

DROP PROCEDURE IF EXISTS `fn_json_GetTeachnew`$$

CREATE DEFINER=`root`@`%` PROCEDURE `fn_json_GetTeachnew`(
p_Aid VARCHAR(64),
p_Cursor INT,
p_Newtype VARCHAR(64))
BEGIN
DECLARE ssql VARCHAR(100);
DECLARE pageSize INT;
DECLARE limitCount INT;
DECLARE tempCount INT;
DECLARE p_Next_Cursor VARCHAR(64);
SET pageSize=20;
SET p_Next_Cursor='';
SET limitCount=p_Cursor*pageSize;
DROP TEMPORARY TABLE IF EXISTS tmp_table_GetTeachnew;
CREATE TEMPORARY TABLE tmp_table_GetTeachnew
SELECT `NewId`,`Title`,`Content`,`PicUrl`,`NewTypeTitle` AS NewType,`PublishDate`,`IsHot`
    FROM `tb_fdt_new_teachnew` t INNER JOIN `tb_fdt_new_newtype` n
    WHERE t.`AgentId`=p_Aid 
    AND t.`NewType`=n.`NewType`
     AND n.`NewTypeTitle`=p_Newtype
    ORDER BY PublishDate DESC;
SET tempCount=(SELECT COUNT(*) FROM tmp_table_GetTeachnew); -- 统计看有多少新闻,然后看看你这次获取了之后,下次还能不能获取,如果下次能获取,返回数字,不能获取返回空
IF(tempCount>p_Cursor*pageSize+pageSize) THEN
    SET p_Next_Cursor=p_Cursor+1;
END IF;
SET ssql="SELECT g.*,? as nextCursor FROM tmp_table_GetTeachnew g LIMIT ?,?";
SET @query=p_Next_Cursor;
SET @fvar=limitCount;
SET @svar=pageSize;
SET @SQUERY=ssql;
PREPARE STMT FROM @SQUERY;
EXECUTE STMT USING @query,@fvar,@svar;
END$$

DELIMITER ;

image

最后的一个例子

DELIMITER $$

USE `xiaoxin`$$

DROP PROCEDURE IF EXISTS `J_F_Getnoticemsg`$$

CREATE DEFINER=`root`@`%` PROCEDURE `J_F_Getnoticemsg`(
p_uid BIGINT,
p_mid BIGINT,   -- 上次获取的最小消息ID值
p_functionid INT,
p_getType INT,    --  0:获取已发通知,1获取已收通知
p_pagesize INT
)
BEGIN
DECLARE tempSql VARCHAR(5000);
-- 2.5【消息】下拉刷新获取历史通知接口
 
-- “Mid”: [数字]消息ID,
-- “Content”:”消息内容”,  	//JSON
-- “Functionid”:”功能ID”,  
-- “Senddate”:”发送时间戳”, //按照时间升序,最旧的最上面,最新的最下面
-- “Senderid”: [数字]发送者身份ID,
-- “Sendername”:”发送者姓名”
-- “ReceiveIds”:”SId,Cid混合的串””//当GetType为0这里有值,当为1 这里没值
IF(p_getType=0) THEN   -- 当是获取已发信息的时候  “ReceiveIds” 有值
	SET tempSql='
	select `Messageid` as `Mid`,`Content`,`Functionid`,`Sendtime`,`Senderid`,`Sendername`,`Targetids` as ReceiveIds
	from `tb_notice_send`
	where  `Functionid`=? and `Senderid`=? and `Messageid`<?
	order by `Sendtime` desc
	limit ?';
	
	SET @fun=p_functionid;
	SET @t_uid=p_uid;
	SET @t_mid=p_mid;
	SET @pagesize=p_pagesize; 
	SET @SQUERY=tempSql; 
	PREPARE STMT FROM @SQUERY; 
	EXECUTE STMT USING @fun,@t_uid,@t_mid,@pagesize;
ELSE
	SET tempSql='
	select `Recordid` as `Mid`,`Content`,`Functionid`,`Sendtime`,`Senderid`,`Sendername`,'''' as ReceiveIds
	from `tb_notice_receive`
	where `Functionid`=? and `Receiverid`=? and `Recordid`<?
	order by `Sendtime` desc
	limit ?';
	SET @fun=p_functionid;
	SET @t_uid=p_uid;
	SET @t_mid=p_mid;
	SET @pagesize=p_pagesize; 
	SET @SQUERY=tempSql; 
	PREPARE STMT FROM @SQUERY; 
	EXECUTE STMT USING @fun,@t_uid,@t_mid,@pagesize;
END IF;
 
 
END$$

DELIMITER ;
原文地址:https://www.cnblogs.com/joeylee/p/2873613.html