mysql行转列
工作中碰到问题
接口传输json存到数据库但有的数据,分隔
如
解决的办法将数据行转换成列
将,分隔的数据转换成多条数据
最后的结果如下
上数据库新建一个表 incre_table 字段AutoIncre
DROP TABLE IF EXISTS incre_table
;
CREATE TABLE incre_table
(
AutoIncreID
int(11) NOT NULL DEFAULT ‘0’,
PRIMARY KEY (AutoIncreID
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
插入数据
INSERT INTO incre_table
VALUES (‘0’);
INSERT INTO incre_table
VALUES (‘1’);
INSERT INTO incre_table
VALUES (‘2’);
INSERT INTO incre_table
VALUES (‘3’);
INSERT INTO incre_table
VALUES (‘4’);
INSERT INTO incre_table
VALUES (‘5’);
INSERT INTO incre_table
VALUES (‘6’);
INSERT INTO incre_table
VALUES (‘7’);
INSERT INTO incre_table
VALUES (‘8’);
INSERT INTO incre_table
VALUES (‘9’);
INSERT INTO incre_table
VALUES (‘10’);
INSERT INTO incre_table
VALUES (‘11’);
INSERT INTO incre_table
VALUES (‘12’);
INSERT INTO incre_table
VALUES (‘13’);
INSERT INTO incre_table
VALUES (‘14’);
select *,substring_index(substring_index(需要分隔的字段名,’,’,b.AutoIncreID),’,’,-1)
from
表名 a
join
incre_table b
on b.AutoIncreID < (length(需要分隔的字段名) - length(replace(需要分隔的字段名,’,’,’’))+1)
原理分析
这个join最基本原理是笛卡尔积。通过这个方式来实现循环。
以下是具体问题分析:
length(字段) - length(replace(字段,’,’,’’))+1 表示了,按照逗号分割后,该列拥有的数值数量,下面简称n
join过程的伪代码:
根据b表字段id进行循环
{
判断:i 是否 < n
{
获取最靠近第 i 个逗号之前的数据, 即 substring_index(substring_index(a.字段,’,’,AutoIncreID),’,’,-1)
i = i +1
}
ID = ID +1
}
总结**:**
这种方法的缺点在于,我们需要一个拥有连续数列的独立表(这里是incre_table)。并且连续数列的最大值一定要大于符合分割的值的个数。
例如有一行的mSize 有100个逗号分割的值,那么我们的incre_table 就需要有至少100个连续行。
insert into 表名(AutoIncreID ) values (1 到 100);
原文地址:https://www.cnblogs.com/cenalulu/archive/2012/08/20/2647463.html
侵删