zoukankan      html  css  js  c++  java
  • 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 ;
  • 相关阅读:
    如何生成随机数
    2017新数组
    JAVA基础
    java基本数据类型
    简易图片自动轮播
    JDK,JRE,JVM
    年月日 日期选择问题
    多选按钮选中进行下一步
    js基本函数和基本方法
    数组简单应用
  • 原文地址:https://www.cnblogs.com/joeylee/p/2873613.html
Copyright © 2011-2022 走看看