我有一张这样的表:
// 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)
答案 0 :(得分:2)
通过查询
尝试此解决方案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
答案 1 :(得分:0)
虽然我认为可能使用存储过程,MySQL变量和自由使用LIKE "%...%"
语句,但它比PHP解决方案要复杂一个数量级。
此外,我认为如果您无法访问存储过程,则根本不可能根据您在最后一列中找到的内容动态创建新的INSERT
语句。
TL; DR:不,让自己开心并使用PHP。