Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用MySQL将记录的值内爆为多行?_Php_Mysql_Implode - Fatal编程技术网

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