2017-09-19 3 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 

私は、クエリの下に使用されますが、このクエリを使用して、私は2つのだけの行に分割することができます。 ...下記の通り、私はテーブルを取得しようとしています

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

これはおそらくデータを正規化するための1回の操作であるため、大雑把なコードで行うことになります。 PHPでこれを行うようにしてください。 SOはコード作成サービスではないので、少なくともこれにいくつかの試行を示すべきです。 –

+0

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

答えて

1

が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 
関連する問題