在MySQL

时间:2019-03-07 08:05:40

标签: mysql

这是我在mysql表中的数据:

+---------+-------------------+------------+
| ID      | Name              | Class      |
+---------+-------------------+------------+
| 1, 2, 3 | Alex, Brow, Chris | Aa, Bb, Cc |
+---------+-------------------+------------+

我希望将值拆分为多行以获取以下格式的数据。

1     Alex     Aa
2     Brow     Bb
3     Chris    Cc

我该怎么做?

2 个答案:

答案 0 :(得分:0)

一个窍门是用数字连接到Tally表。
然后使用SUBSTRING_INDEX来获取零件。

如果您还没有数字表,这是一种方法。

drop table if exists Digits;
create table Digits (n int primary key not null);
insert into Digits (n) values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);

drop table if exists Nums;
create table Nums (n int primary key not null);

insert into Nums (n) 
select (n3.n*100+n2.n*10+n1.n) as n
from Digits n1
cross join Digits n2
cross join Digits n3;

然后可以用来展开这些列

样本数据:

drop table if exists YourTable;
create table YourTable (
  ID varchar(30) not null,
  Name varchar(30) not null,
  Class varchar(30) not null
);

insert into YourTable 
  (ID, Name, Class) values
  ('1, 2, 3', 'Alex, Brow, Chris', 'Aa, Bb, Cc')
, ('4, 5, 6', 'Drake, Evy, Fiona', 'Dd, Ee, Ff')
;

查询:

SELECT 
 LTRIM(SUBSTRING_INDEX( SUBSTRING_INDEX( t.ID, ',', Nums.n), ',', -1)) AS Id,
 LTRIM(SUBSTRING_INDEX( SUBSTRING_INDEX( t.Name, ',', Nums.n), ',', -1)) AS Name,
 LTRIM(SUBSTRING_INDEX( SUBSTRING_INDEX( t.Class, ',', Nums.n), ',', -1)) AS Class
FROM YourTable t
LEFT JOIN Nums ON n BETWEEN 1 AND (LENGTH(ID)-LENGTH(REPLACE(ID, ',', ''))+1);

结果:

Id  Name    Class
1   Alex    Aa
2   Brow    Bb
3   Chris   Cc
4   Drake   Dd
5   Evy     Ee
6   Fiona   Ff

答案 1 :(得分:-1)

不建议在一个字段中使用多个值,但是如果您想要一种解决方案,则可以用逗号分割字符串并插入到表中。

请参阅此博客文章,其中显示了如何拆分https://nisalfdo.blogspot.com/2019/02/mysql-how-to-insert-values-from-comma.html#more