如何使用MySQL将记录的值压缩到多行?

时间:2015-12-02 13:30:39

标签: php mysql implode

我有一张这样的表:

// 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)

2 个答案:

答案 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。