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();

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


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26855487/viewspace-764765/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26855487/viewspace-764765/

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值