如何使用 MySQL 将记录的值内爆到多行?

How to implode the value of a record to multiple rows using MySQL?

我有一个 table 这样的:

// mytable
+----+--------+-------------------+
| id |  word  |      numbers      |
+----+--------+-------------------+
| 1  | hello  | 1<br>2<br>3<br>   |
| 2  | how    | 12<br>15<br>      |
| 3  | are    | 453<br>1<br>      |
| 4  | you    | 3<br>33<br>453<br>|
+----+--------+-------------------+

我想要这个输出:

// mynewtable
+----+--------+---------+
| id |  word  | numbers |
+----+--------+---------+
| 1  | hello  | 1       |
| 2  | hello  | 2       |
| 3  | hello  | 3       |
| 4  | how    | 12      |
| 5  | how    | 15      | 
| 6  | are    | 453     |
| 7  | are    | 1       |
| 8  | you    | 3       |
| 9  | you    | 33      |
| 10 | you    | 453     |
+----+--------+---------+

我可以使用 PHP 做到这一点。首先,我必须获取所有行并通过 <br> 将它们内爆,然后再次插入它们。但是现在我想知道,有没有更好的解决办法? (专门使用纯MySQL)

虽然我认为可以使用存储过程、MySQL 变量和自由使用 LIKE "%...%" 语句,但它比 [=21= 复杂一个数量级]解决方案。

此外,如果您无法访问存储过程,我认为根本不可能,因为您需要根据您在最后一列中找到的内容动态创建新的 INSERT 语句。

TL;DR: 不,让自己开心并使用 PHP.

通过查询尝试此解决方案

SELECT @row := @row + 1 as row, t.word, t.number FROM (
    SELECT
      word,
      SUBSTRING_INDEX(SUBSTRING_INDEX(numbers, '<br>', n.digit+1), '<br>', -1) number
    FROM split_rec
    INNER JOIN 
        (SELECT 0 digit UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) n
        ON LENGTH(REPLACE(numbers, '<br>' , '')) <= LENGTH(numbers)-n.digit
    ORDER BY id, n.digit
) AS t, (SELECT @row := 0) r 
WHERE t.number <> ''

输出

row word    number
1   hello   1
2   hello   2
3   hello   3
4   how     12
5   how     15
6   are     453
7   are     1
8   you     3
9   you     33
10  you     453