MySQL에서 두 개 이상의 행에 흩어져 있는 속성 값을 하나로 합치려면 GROUP_CONCAT() 함수를 사용하면 됩니다. 이때 값과 값 사이의 구분자(separator)로 하이픈(-)을 지정할 수 있습니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable1386
-> (
-> Title varchar(255),
-> Name varchar(60)
-> );
Query OK, 0 rows affected (0.67 sec)
2. 데이터 삽입하기
INSERT 명령을 사용해 테이블에 레코드를 추가합니다. 여기서는 동일한 책 제목(Title)에 서로 다른 저자(Name)가 매핑되도록 중복 데이터를 넣었습니다.
mysql> insert into DemoTable1386 values('Introduction to MySQL','Paul DuBois');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable1386 values('Java in Depth','Khalid Mughal');
Query OK, 1 row affected (0.48 sec)
mysql> insert into DemoTable1386 values('Introduction to MySQL','Russell Dyer');
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable1386 values('Java in Depth','Joshua Bloch');
Query OK, 1 row affected (0.17 sec)3. 전체 레코드 조회하기
SELECT 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select * from DemoTable1386;
위 쿼리는 다음과 같은 결과를 출력합니다.
+-----------------------+---------------+
| Title | Name |
+-----------------------+---------------+
| Introduction to MySQL | Paul DuBois |
| Java in Depth | Khalid Mughal |
| Introduction to MySQL | Russell Dyer |
| Java in Depth | Joshua Bloch |
+-----------------------+---------------+
4 rows in set (0.00 sec)
4. 중복 값을 하나로 결합하는 쿼리
이제 GROUP_CONCAT() 함수와 GROUP BY 절을 함께 사용하면, 중복된 Title 값을 기준으로 저자 이름들을 하이픈으로 연결해 한 행으로 묶을 수 있습니다.
mysql> select Title,group_concat(Name separator '----') from DemoTable1386
-> group by Title;
실행 결과는 다음과 같습니다.
+-----------------------+-------------------------------------+
| Title | group_concat(Name separator '----') |
+-----------------------+-------------------------------------+
| Introduction to MySQL | Paul DuBois----Russell Dyer |
| Java in Depth | Khalid Mughal----Joshua Bloch |
+-----------------------+-------------------------------------+
2 rows in set (0.00 sec)
참고 사항
separator 키워드 뒤에 원하는 구분 문자열을 지정하면 되며, 위 예제에서는 4개의 하이픈('----')을 사용했습니다. 만약 구분자를 지정하지 않으면 기본값인 콤마(,)로 연결됩니다. 또한 GROUP_CONCAT() 함수에는 기본적으로 최대 길이 제한(group_concat_max_len, 기본값 1024바이트)이 있으므로, 대량의 데이터를 결합할 때는 이 설정값을 조정하는 것이 좋습니다.