2011-11-03 7 views
2

사람들이 버그 문제에 대한 참조를 "Fixed issue # 2345 - ......"형식으로 입력하는 주석 열이있는 "changesets"테이블이 있지만, "Fixed issues # 456, # 2956, # 12345 ...." 이러한 참조 번호를 선택하는 가장 좋은 방법은 가입을 통해 문제에 액세스 할 수 있도록하는 것입니다. 이 변경 주어진텍스트에서 항목을 선택하는 MySql 문자열 조작

, 내가 SUBSTRING_INDEX (SUBSTRING_INDEX ('#'을 사용했습니다이

changeset_id issue_id 
===================== 
1   234 
2   789 
2   7895 
2   123 
3   129 

같은 결과를 원하는 테이블을

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

을 설정 - 1), '', 1) 타입의 구조를 만들지 만 라인 당 하나의 참조만을 반환합니다.

또한이 텍스트 조회

을 할 수있는 가장 효율적인 방법을 찾고 어떤 도움을

감사

+0

http://stackoverflow.com/questions/1096679/can-mysql-split-a-column 문자열을 분할하는 방법에 대한 힌트를 제공합니다. – Fluff

+0

그게 해결할 문제가 될 것 같아요. SQL *으로 모두 SQL에 있어야합니까? '#'을 사용하여 모든 주석을 얻은 다음 응용 프로그램에서 일을 쉽게 처리 할 수있는 지점이 있습니다. 예를 들어, '#'을 사용하여 모든 주석을 얻은 다음 해당 숫자를 구문 분석하고 그 내용을 처리하십시오. – Cylindric

답변

0

여기에 원하는 데이터 집합을하는 방법에 대한 하나의 (비 대한/지저분) 접근 방식의 감사 ...

1 단계 - 문제 ID의 최대 #이 무엇인지 파악

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

2 단계 - 이슈 ID의 최대 수와 동일한 수의 "레벨"로 UNION의 질의를 재귀 적으로 작성하십시오. 귀하의 예를 들어,

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 

나는 중복 행을 제거하는 UNION의 능력, 그리고 정수를 결정할 때 주요 숫자 값을 사용하는 CAST의 능력 advangage 데려 갈거야.

당신의 장난감 데이터 세트를 사용하여 그 결과

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