mysql循环表中数据--游标

本文介绍了一种在MySQL中利用循环和游标来实现连续两个月信息表的连表查询方法。首先创建一个日期表,存储一年中的每月最后一天日期,然后设置游标遍历日期,通过动态SQL准备并执行查询语句,将查询结果插入到结果表中。这种方法适用于需要观察指标随时间变化的场景。
摘要由CSDN通过智能技术生成

背景:有每个月的信息表,想要查询一年内每个月的指标变化,需要对连续2个月的表进行连表查询。eg 从1月到2月,某项指标的变化;从2月到3月,某项指标的变化。

目标:通过循环得到2个连续的日期表名,然后通过表名进行查询

方法:因为12个表名的格式为XXX+月份+30号。eg:XXX20210130、XXX20210130,我们只需要创建一张日期表,把20210130、20210130等共12个数据插入表中,然后通过游标循环得到连续的2个日期,再拿这2个日期作为表名去查询。

DROP PROCEDURE IF EXISTS test;
DROP TABLE IF EXISTS result_table; #连表查询的结构就放在result_table里
CREATE PROCEDURE test()
BEGIN
 DECLARE last_vari VARCHAR(20);#上一个变量
 DECLARE now_vari varchar(20);#当前变量(和上一个变量是挨着的)
 DECLARE done int DEFAULT 0; #定义游标结束的标志
 DECLARE cursor_name CURSOR FOR 
   SELECT dataid FROM datalist;#遍历日期表
 DECLARE CONTINUE HANDLER FOR NOT found SET done = 1; #游标走完了,就把done赋值1
 OPEN cursor_name; 
  SET last_vari = '';#初始化变量
  REPEAT
   FETCH cursor_name INTO now_vari;  #把游标遍历得到的当前dataid赋值给now_vari
    if done != 1 && last_vari !='' then  #如果游标指向的是第二个及以后的dataid(我们有2个连续的日期)
			SET @sqlStr:=CONCAT("insert into result_table SELECT * from 
	(SELECT * FROM
	(select * FROM XXX",last_vari,") AS a
	left JOIN
	(select * FROM XXX",now_vari,") AS b 
	on a.`借据号`=b.`借据号`	) AS c");#把查询的结果插入表中;这里的查询语句只是示例,自己根据写业务自己的查询语句;

			PREPARE stmt from @sqlStr;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt; 
     set last_vari = now_vari; #把now_vari赋值给last_vari
    ELSEIF done != 1 && last_vari ='' then  #如果游标指向的是第一个dataid(我们没有2个连续的日期)
     set last_vari = now_vari; #把当前dataid赋值给last_vari
		 SET @sqlStr1:=CONCAT("CREATE TABLE result_table AS SELECT * from  
	(SELECT * FROM
	(select * FROM XXX",last_vari,") AS a
	left JOIN
	(select * FROM XXX",now_vari,") AS b 
	on a.`借据号`=b.`借据号`	) AS c LIMIT 0");#这里的查询语句只是示例,自己根据写业务自己的查询语句
	#这里的目的是创建result_table并定义表,以后只需要向表添加数据即可;LIMIT 0不可少,不然查出来的数据就会插入表(此时我们没有连续的2个日期,查出来的数据是不对的)
			PREPARE stmt1 from @sqlStr1;
      EXECUTE stmt1;
      DEALLOCATE PREPARE stmt1; 
			SELECT * FROM result_table;
    end if;
   UNTIL done = 1 
  END REPEAT;
  CLOSE cursor_name ;
  SELECT * FROM result_table;
END

call test()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值