2017-09-19 2 views
1

나는 여러 행에 Training_name 열 값을 분할 할 테이블 훈련이 있습니다mysql을 - 행에 분할 열이 동적으로

SLNO Category Training_name 
1  A  1,5,9,15,12,16 
2  B  2,6,10,17 
3  C  1,3,7,19,14,18 

나는 쿼리 아래 사용하지만 난 두 행으로 분할 할 수 있습니다이 쿼리를 사용하여. .. 아래로 내가 표를 얻기 위해 노력하고

SELECT training.SLNO,training.CATEGORY, SubString_Index(training.TRAINING_NAME, ',', 1) AS TRAINING_NAME FROM training UNION ALL SELECT training.SLNO,training.CATEGORY, SubString_Index(training.TRAINING_NAME, ',', -1) FROM training 

, 여기

SLNO Category Training_name 
1  A  1 
1  A  5 
1  A  9 
1  A  15 
1  A  12 
1  A  16 
2  B  2 
2  B  6 
2  B  10 
2  B  17 
3  C  1 
3  C  3 
3  C  7 
3  C  19 
3  C  14 
3  C  18 
+1

바라건대 당신은 데이터 구조를 해결하기 위해이 작업을 수행 할 수 있습니다. –

+0

이것은 아마도 데이터를 표준화하기위한 일회성 작업 일 것이므로 코드의 거친 부분이 할 것입니다. PHP에서이 작업을 시도해야합니다. SO는 코드 작성 서비스가 아니므로 최소한이 시도를 보여 주어야합니다. –

+0

https://stackoverflow.com/questions/17308669/reverse-group-concat-in-mysql – etsa

답변

1

하나입니다 저를 도와주세요 방법 :

select slno, category, substring_index(training_name, ',', 1) + 0 as training_id 
from t 
union all 
select slno, category, substring_index(substring_index(training_name, ',', 2), ',', -1) + 0 as training_id 
from t 
where training_name like '%,%' 
union all 
select slno, category, substring_index(substring_index(training_name, ',', 3), ',', -1) + 0 as training_id 
from t 
where training_name like concat('%', repeat(',%', 2)) 
union all 
select slno, category, substring_index(substring_index(training_name, ',', 4), ',', -1) + 0 as training_id 
from t 
where training_name like concat('%', repeat(',%', 3)) 
union all 
. . . 

필요한만큼 반복하십시오. 결과를 새 테이블에 저장하십시오. 외부 키 참조 및 기타 데이터 측면을 수정합니다. 원래 테이블을 버리고 (잘 보관하십시오) 다시는 해당 구조를 사용하지 마십시오.

3
DROP TABLE IF EXISTS my_bad_table; 
DROP TABLE IF EXISTS my_good_table; 

CREATE TABLE my_bad_table 
(SLNO INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,Category CHAR(1) NOT NULL 
,Training_name VARCHAR(200) NOT NULL 
); 

INSERT INTO my_bad_table VALUES 
(1,'A','1,5,9,15,12,16'), 
(2,'B','2,6,10,17'), 
(3,'C','1,3,7,19,14,18'); 

CREATE TABLE my_good_table AS 
SELECT DISTINCT x.SLNO 
       , x.Category 
       , CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(x.training_name,',',y.i+1),',',-1) AS UNSIGNED) training_name 
      FROM my_bad_table x 
       , (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 8 UNION SELECT 9) y 
      ORDER 
      BY slno 
       , category 
       , training_name; 

SELECT * FROM my_good_table; 
+------+----------+---------------+ 
| SLNO | Category | training_name | 
+------+----------+---------------+ 
| 1 | A  |    1 | 
| 1 | A  |    5 | 
| 1 | A  |    9 | 
| 1 | A  |   12 | 
| 1 | A  |   15 | 
| 1 | A  |   16 | 
| 2 | B  |    2 | 
| 2 | B  |    6 | 
| 2 | B  |   10 | 
| 2 | B  |   17 | 
| 3 | C  |    1 | 
| 3 | C  |    3 | 
| 3 | C  |    7 | 
| 3 | C  |   14 | 
| 3 | C  |   18 | 
| 3 | C  |   19 | 
+------+----------+---------------+ 

1이 항상 'A'등인 경우 중복을 제거하려면 정규화를 향한 추가 단계가 필요합니다.

0

그것은 나에게 작동 ..

SELECT DISTINCT x.PARENT_SLNO, x.TRAINING_CATEGORY, CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(x.TRAINING_NAME,',',y.i+1),',',-1) AS UNSIGNED) TRAINING_NAME FROM assessment_training x, (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 8 UNION SELECT 9) y where PARENT_SLNO = 3 and TRAINING_CATEGORY='technical' ORDER BY PARENT_SLNO,TRAINING_CATEGORY,TRAINING_NAME 
관련 문제