mysql call的结果集怎么合并_mysql-列合并成行方式

背景:近来总有玩家反馈少领取奖励的情形,所有待发奖励的玩家被汇总到某张的表的字段中,通过查询历史数据,发现在

insert到表时,数据有可能被截取啦,mysql没有设置sql_mode,没有错误或警告日志可以查询,同时,存放数据字段类型text,不

管怎样,也许是数据太长导致,故开发同学,要求DB段写个sp,按照每行1w数据行,分多行存放玩家数据,以免后续再

次可能发生。

表A:

Role_Id

11111

2222

3333

4444

5555

......

.....

表B:.

转换成:

id

1  1111,2222,3333....

2  444,55555,.....

如下通过游标方式实现转换过程:

CREATE TABLE B (

`Id` int(11) NOT NULL AUTO_INCREMENT COMMENT '流水Id',

`Role_Id` VARCHAR(8000),

PRIMARY KEY (`Id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=xxx';

DROP PROCEDURE IF EXISTS sp_test_rows;

CREATE PROCEDURE ` sp_test_rows`()

BEGIN

DECLARE i INT;  #一行多少字符关联

DECLARE vRoleId INT; #临时存放游标中roleid

DECLARE tRoleId VARCHAR(8000);#临时存放insert到中间表中的字符串

DECLARE done INT;

DECLARE cur CURSOR FOR SELECT Role_Id FROM A; #游标遍历数据

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;

SET i=0;

OPEN cur;

label_loop:LOOP

SET i=i+1;

FETCH cur INTO vRoleId;

IF done THEN

LEAVE label_loop;

END IF;

SET tRoleId=CONCAT_WS(',',tRoleId,vRoleId);

IF MOD(i,1000)=0 THEN   #一行中有1k字符保存表中;

INSERT INTO B(Role_Id) SELECT tRoleId;   #开始存放转换数据行;

SET tRoleId=NULL;

END IF;

END LOOP label_loop;

CLOSE cur;

IF tRoleId IS NULL then

select '';

ELSE

INSERT INTO B(Role_Id) SELECT tRoleId;#存放超过1k之后,数据行

END IF;

END;

call sp_test_rows();

方法有些啰嗦,若有其他方法,还请分享下,^_^

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值