2011-11-03 70 views
2

我有一個「更改集」表,其中有一個評論欄,其中人們以「固定問題#2345 - ......」格式輸入對錯誤問題的引用,但也可以是「固定問題#456,#2956,#12345 ....」 什麼是最好的方式來選擇這些參考號碼,所以我可以通過連接訪問問題。MySql字符串操作,從文本中選擇項目

給出這一變化將表

id  comments 
=========================== 
1  fixed issue #234 .... 
2  DES - #789, #7895, #123 
3  closed ticket #129 

我想這樣

changeset_id issue_id 
===================== 
1   234 
2   789 
2   7895 
2   123 
3   129 
我用SUBSTRING_INDEX(SUBSTRING_INDEX( '#'

結果, - 1),」」,1 )類型的構造,但只會返回每行一個引用。

也在尋找最有效的方式做到這一點的文字查找

任何幫助表示讚賞

感謝

+0

http://stackoverflow.com/questions/1096679/can-mysql-split-a-column就如何分割字符串提示。 – Fluff

+0

我認爲這將會是一個難以解決的問題。 *是否全部在SQL中?事實上,在你的應用程序中,事情更容易實現,比如用'#'來獲得所有的評論,然後解析出數字並用它們做一些事情。 – Cylindric

回答

0

這裏有一個(臃腫/雜亂)如何獲取所需的數據集的方法...

第1步 - 找出什麼問題ID的最大#是

SELECT MAX(LENGTH(comments)- LENGTH(REPLACE(comments,'#',''))) AS max_issues 
FROM change_sets 

第2步 - 遞歸地創建一個UNION'd查詢,其中的「levels」數量等於發佈ID的最大數量。對於你的榜樣,

SELECT changeset_id, issue_id FROM 
(
SELECT id AS changeset_id, CAST(SUBSTRING_INDEX(comments,'#',-1) AS UNSIGNED) AS issue_id FROM change_sets 
UNION 
SELECT id AS changeset_id, CAST(SUBSTRING_INDEX(comments,'#',-2) AS UNSIGNED) AS issue_id FROM change_sets 
UNION 
SELECT id AS changeset_id, CAST(SUBSTRING_INDEX(comments,'#',-3) AS UNSIGNED) AS issue_id FROM change_sets 
) a 
HAVING issue_id!=0 
ORDER BY changeset_id, issue_id 

我正在advangage的聯盟去除重複行的能力,以及CAST的決定整數時要使用的領先的數字值的能力。

使用你的玩具數據集的結果:

+--------------+----------+ 
| changeset_id | issue_id | 
+--------------+----------+ 
|   1 |  234 | 
|   2 |  123 | 
|   2 |  789 | 
|   2 |  7895 | 
|   3 |  129 | 
+--------------+----------+