MySQL 在一列中按分号拆分,每次拆分形成一个新行

MySQL split on semicolon in a column to form a new row for each split

所以我得到了遗留 mysql 数据库,其中的数据如下所示:

   DATE     |     DATA
2015-04-27  | sample; sample2; sample3
2015-04-28  | sample1; sample4

我想创建一个新的 table 来存储 date/data 对。

   DATE     |     DATA
2015-04-27  | sample
2015-04-27  | sample2
2015-04-27  | sample3
2015-04-28  | sample1
2015-04-28  | sample4

我试过查看用户定义的拆分函数,但它们似乎都只想拆分一个 char 和 return 一个拆分实例。我需要保留所有实例以放入新的 table。

所以使用这个:http://blog.fedecarg.com/2009/02/22/mysql-split-string-function/

我创建了拆分函数并尝试更改 return:

REPLACE(SUBSTRING(SUBSTRING_INDEX(list, ';'),
LENGTH(SUBSTRING_INDEX(list, ';', pos -1)) + 1),
delim, '')

但是它需要第三个参数来指定你想要哪个实例return。有没有办法 return 新行的所有实例都带有左列的日期?

这是一个想法...

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table 
( date DATE NOT NULL
, data VARCHAR(100) NOT NULL
);

INSERT INTO my_table VALUES
('2015-04-27','sample; sample2; sample3'),
('2015-04-28','sample1; sample4');

SELECT * FROM my_table;;
+------------+--------------------------+
| date       | data                     |
+------------+--------------------------+
| 2015-04-27 | sample; sample2; sample3 |
| 2015-04-28 | sample1; sample4         |
+------------+--------------------------+

SELECT * FROM ints;
+---+
| i |
+---+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
+---+

SELECT DISTINCT date
              , data
              , TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(data,';',i+1),';',-1)) x 
           FROM ints
              , my_table
          ORDER 
             BY date,i;

+------------+--------------------------+---------+
| date       | data                     | x       |
+------------+--------------------------+---------+
| 2015-04-27 | sample; sample2; sample3 | sample  |
| 2015-04-27 | sample; sample2; sample3 | sample2 |
| 2015-04-27 | sample; sample2; sample3 | sample3 |
| 2015-04-28 | sample1; sample4         | sample1 |
| 2015-04-28 | sample1; sample4         | sample4 |
+------------+--------------------------+---------+