2015-12-02 22 views
0

我有這樣一個表:如何使用MySQL將記錄的值內爆到多行?

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

+3

可能這將是一個很好的時間來重構一個相當糟糕設計一塊數據庫 – RiggsFolly

+0

的。如果你能代替'
'用一個單一的字符然後[我可以解決這個純粹的MySQL?加入';'列中的分隔值](http://stackoverflow.com/a/33806675/3184785)也許很有趣。您可以更改功能以使用'
'作爲分隔符。它會給你想要的輸出。 –

+0

什麼@RiggsFolly說 - 時間來重構和修復的東西。設計第一個模型的人不知道如何使用數據庫。你可以破解並試圖讓它工作,在這個過程中遇到很多問題,或者你可以簡單地創建一個存儲信息的表格,就像你在輸出示例中顯示的一樣。祝你好運,我希望你決定以正確的方式做,因爲這將是最少的工作量。 – Mjh

回答

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 
+0

好了。 +1。 – Shafizadeh

0

雖然我認爲有可能使用存儲過程中,MySQL變量和自由使用的LIKE "%...%"報表,這將是數量級上要比PHP解決更復雜的順序。

此外,我認爲根本無法訪問存儲過程,因爲您需要基於最後一列中的內容動態創建新的INSERT語句。

TL; DR:不,讓自己開心並使用PHP。

相關問題