Php 如何使用MySQL将记录的值内爆为多行?
我有一张这样的桌子:Php 如何使用MySQL将记录的值内爆为多行?,php,mysql,implode,Php,Mysql,Implode,我有一张这样的桌子: // mytable +----+--------+-------------------+ | id | word | numbers | +----+--------+-------------------+ | 1 | hello | 1<br>2<br>3<br> | | 2 | how | 12<br>15<br> | | 3 | are | 45
// 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>|
+----+--------+-------------------+
我可以使用PHP来实现这一点。首先,我必须获取所有行并通过
对它们进行内爆,然后再次插入它们。但现在我想知道,有没有更好的解决办法?(特别是使用纯MySQL)虽然我认为可以使用存储过程、MySQL变量和像“%…%”语句这样的自由使用,但这将比PHP解决方案复杂一个数量级
此外,我认为如果您没有访问存储过程的权限,则根本不可能,因为您需要根据最后一列中的内容动态创建新的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 <> ''
如果您可以用单个字符替换
,那么这可能是重构数据库中设计糟糕的部分的好时机。您可以将函数更改为使用
作为分隔符。@riggsfully所说的——是时候进行重构和修复了。设计第一个模型的人不知道数据库是如何使用的。您可以四处闯荡并尝试让它工作,同时也可以简单地创建一个存储信息的表,如输出示例中所示。祝你好运,我真的希望你决定用正确的方式去做,因为那将是最少的工作量。我同意@Mjh。Ryan Vincent在选择/调整查询中的数据方面为您指明了正确的方向,但接下来您将面临的问题是将所选数据转换为INSERT
查询。它很快就会变得非常复杂和混乱。只是为了弄清楚。我总是使用规范化的表。我回答这个问题的唯一原因是想找到一些处理分隔字符串中这些“讨厌的”外键的“标准方法”。这些函数与在_集合中查找
相关-/
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