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();
方法有些囉嗦,若有其他方法,還請分享下,^_^
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL-模仿陣列使用方式MySql陣列
- php合併陣列的幾種方式PHP陣列
- 合併陣列陣列
- FLEX合併陣列Flex陣列
- GridView列相同合併View
- sql 中將多列變成行SQL
- JS--陣列物件合併JS陣列物件
- 合併兩個有序陣列陣列
- pandas 兩列資料合併
- Hive列合併與元素蒐集Hive
- JavaScript concat()合併陣列JavaScript陣列
- 藍橋杯-合併數列
- 命令列中的拆分與合併命令列
- js如何合併兩個陣列JS陣列
- 88、合併兩個有序陣列陣列
- 演算法合併排序陣列演算法排序陣列
- js合併兩個陣列物件JS陣列物件
- Python合併字典的七種方式!Python
- 合併JavaScript陣列的N種方法JavaScript陣列
- 88. 合併兩個有序陣列陣列
- el-table 自動合併所有列
- NumPy 陣列迭代與合併詳解陣列
- Android合併檔案的3種方式Android
- 【MySQL】MySQL如何合併多行資料,行轉列,group_concat 多行合併MySql
- Hbase-原理-region合併和hfile的合併(大合併、小合併)
- js陣列物件相同項合併處理JS陣列物件
- el-table 合併相同資料的列
- [CareerCup] 11.1 Merge Arrays 合併陣列陣列
- MySQL 合併查詢join 查詢出的不同列合併到一個表中MySql
- poi報表匯出 複雜匯出 指定合併列和對比重複列合併行動態匯出
- 兩個有序陣列如何合併成一個有序陣列陣列
- 將兩個有序陣列合併為一個有序陣列陣列
- 18.合併兩個有序陣列(簡單)陣列
- js實現table合併相同列單元格JS
- 合併陣列物件中相同的屬性值陣列物件
- jQuery合併兩個陣列程式碼例項jQuery陣列
- js合併兩個陣列程式碼例項JS陣列
- (合併 重疊陣列)練習容器的用法陣列