2014-07-10 6 views
-1

나는이 값 172,173, 174 내 ID와 6,7 내 상태 내 문자열에 :에 의해 분리되어있다MySQL의 쉼표로 구분 된 문자열은

172:6,173:6,174:7 

내 DB에 상태 필드가 있습니다.

이제 mysql에 쿼리를 적어서 상태가 6, 인 ID를 얻고 싶습니다. id를 얻기 위해 문자열을 어떻게 폭발시킬 수 있습니까?

내 첫 번째 테이블은

id target_course name 
172  A 
173  B 
174  C 

지금 내가이 두 테이블에 가입하고 그 상태 6

입니다 그 ID를 얻으려면 필드

id lead_ref status 
1  R-1  172:6,173:6,174:7 

나의 다음 테이블 ID 교육 목표를 가지고 교육 정보 테이블

+0

는 가정 위 예제에서 주어진 결과로'172'와'173'을 원합니다. 문자열을 파싱하고 ID와 STATUS 열이있는 임시 테이블에 모든 문자열을 집어 넣은 다음 쿼리를 실행합니다. –

+2

데이터베이스를 정상화 할 기회가 있으면 그렇게해야합니다. 문자열 비교 및 ​​자리 표시자를 사용하여 선택하는 것은 DBMS에서 데이터를 검색하는 최악의 경우입니다. 관계에 대해 별도의 테이블을 만들고 그 테이블을 쿼리하십시오. – feeela

+0

나는 많은 테이블을 조인했다. 그리고 나는 나의 ID의 상태를 6이어야한다. 내 테이블을 임시 테이블로 정규화하고 사용하는 것은 약간 복잡한 프로세스이다. – nitin

답변

0

가능하지만 실제 환경에서 사용하는 것보다 데이터베이스를 재 설계하도록하는 것이 좋습니다.

상수를 함께 사용하여 숫자 범위를 생성 할 수 있습니다. 그것은 당신이 0에서 9까지의 숫자를 조합하고 십자가에 합류하면 0에서 99까지의 숫자를 생성 할 수 있습니다 (또 다른 교차 결합은 0에서 999까지를 제공합니다). 이것을 SUBSTRING_INDEX와 함께 사용하여 쉼표를 기준으로 문자열을 분할 할 수 있습니다.

이렇게하면 substring_index를 사용하여 마지막에 반환 된 숫자를 최대 회수로 늘리는 것과 같이 substring_index를 사용하면 DISTINCT를 사용할 수 있습니다. 당신이 원하는 경우

SELECT DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(some_field, ',', 1 + units.i + tens.i * 10), ',', -1), ':', 1) AS id 
FROM some_table 
CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units 
CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens 
WHERE SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(some_field, ',', 1 + units.i + tens.i * 10), ',', -1), ':', -1) = 6 

는 중복 배의 오른쪽 숫자는 쉼표로 구분 된 값의 수 (수 아무것도로 대체 모든 쉼표로 필드의 길이 필드의 길이를 비교를 확인해야 반환 쉼표 수) : -

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(some_field, ',', 1 + units.i + tens.i * 10), ',', -1), ':', 1) AS id 
FROM some_table 
CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units 
CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens 
WHERE SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(some_field, ',', 1 + units.i + tens.i * 10), ',', -1), ':', -1) = 6 
AND (units.i + tens.i * 10) <= (LENGTH(some_field) - LENGTH(REPLACE(some_field, ',',''))) 

두 가지 모두 최대 100 개의 쉼표로 구분 된 값만 처리합니다. 더 쉽게 대처할 수 있도록 확장하기는 쉽지만 쿼리가 느려지 게됩니다.

편집 - 당신은 지금 위에 게시 한 데모 날짜 상태의 대상 코스 이름을 얻을 : - 이것에 대한

SELECT education_details.id, education.target_course_name 
FROM education_details 
CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units 
CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens 
INNER JOIN education ON SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(status, ',', 1 + units.i + tens.i * 10), ',', -1), ':', 1) = education.id 
WHERE SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(status, ',', 1 + units.i + tens.i * 10), ',', -1), ':', -1) = 6 
AND (units.i + tens.i * 10) <= (LENGTH(status) - LENGTH(REPLACE(status, ',',''))); 

SQL 바이올린 : -

http://www.sqlfiddle.com/#!2/a2917/5

0

저기 저 :

SELECT `status` 
FROM `table` 
WHERE `status` LIKE `%:6,%` -- if there is a matching status before a comma 
    OR `status` LIKE `%:6`; -- if there is matching status as last item 

MySQL에서 문자열을 분리/폭발시킬 가능성은 거의 없습니다. Can you split/explode a field in a MySQL query?

+0

이것은 항목에 쉼표로 구분 된 목록이 있고 항목을 분리하지 않은 경우 사용해야하는 제 대답의 버전입니다. – tholu