여러 레코드에 걸쳐 열 값이 서로 동일한지 확인하고, 그 값들을 하나의 행에 특수 문자로 구분해 나열하려면 GROUP_CONCAT() 함수와 DISTINCT 키워드를 함께 사용하면 됩니다. 먼저 예제에 사용할 테이블부터 만들어 보겠습니다.
1. 예제 테이블 생성
mysql> create table DemoTable
(
Id int,
Subject varchar(40)
);
Query OK, 0 rows affected (0.56 sec)
2. 샘플 데이터 삽입
insert 명령을 사용해 테이블에 레코드를 몇 개 넣어 보겠습니다. 일부러 중복된 값도 함께 입력합니다.
mysql> insert into DemoTable values(100,'MySQL'); Query OK, 1 row affected (0.19 sec) mysql> insert into DemoTable values(100,'MongoDB'); Query OK, 1 row affected (0.20 sec) mysql> insert into DemoTable values(100,'Java'); Query OK, 1 row affected (0.14 sec) mysql> insert into DemoTable values(100,'MongoDB'); Query OK, 1 row affected (0.11 sec) mysql> insert into DemoTable values(101,'MySQL'); Query OK, 1 row affected (0.16 sec) mysql> insert into DemoTable values(101,'MySQL'); Query OK, 1 row affected (0.10 sec)
3. 전체 레코드 조회
select 문으로 테이블의 모든 레코드를 확인해 보겠습니다.
mysql> select *from DemoTable;
위 쿼리는 다음과 같은 결과를 출력합니다.
+------+---------+ | Id | Subject | +------+---------+ | 100 | MySQL | | 100 | MongoDB | | 100 | Java | | 100 | MongoDB | | 101 | MySQL | | 101 | MySQL | +------+---------+ 6 rows in set (0.00 sec)
결과를 보면 Id가 100인 레코드에는 'MongoDB'가, Id가 101인 레코드에는 'MySQL'이 중복되어 저장되어 있습니다.
4. 특수 문자로 구분해 한 행으로 합치기
이제 여러 레코드 간에 열 값이 동일한지 확인하고, 이 값들을 특수 문자로 구분해 단일 행으로 묶는 쿼리입니다. 여기서는 구분자(separator)로 하이픈(-)을 사용했습니다.
mysql> select Id,group_concat(distinct Subject separator '-') as Subject
from DemoTable
group by Id;
실행 결과는 다음과 같습니다.
+------+--------------------+ | Id | Subject | +------+--------------------+ | 100 | Java-MongoDB-MySQL | | 101 | MySQL | +------+--------------------+ 2 rows in set (0.04 sec)
핵심 정리
GROUP_CONCAT() 내부에 DISTINCT를 지정하면 그룹 내에서 중복된 값이 자동으로 제거됩니다. 또한 separator 옵션을 사용하면 기본값인 콤마(,) 대신 하이픈, 슬래시 등 원하는 구분 문자를 자유롭게 지정할 수 있습니다. 위 예제에서는 Id를 기준으로 group by로 그룹화한 뒤, 각 그룹의 Subject 값을 하이픈으로 연결해 한 행으로 깔끔하게 출력했습니다.