如何使用 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
我有一个 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