MySQL에서 중복 값을 형식화하여 가져오는 방법
중복된 값(예: 동일한 학생 이름)을 하나의 행으로 묶고, 각각의 값을 쉼표 등으로 구분해 형식화된 문자열로 출력하려면 GROUP_CONCAT() 함수를 사용하는 것이 가장 효율적입니다. 이 함수는 GROUP BY 절과 함께 사용하여 여러 행의 값을 하나의 문자열로 손쉽게 병합할 수 있습니다.
1. 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable1561
-> (
-> StudentName varchar(20),
-> Title text
-> );
Query OK, 0 rows affected (0.60 sec)
2. 샘플 데이터 삽입
INSERT 명령을 사용해 몇 개의 레코드를 삽입합니다. 여기서 'Adam'은 의도적으로 두 번 입력되어 중복 데이터 상황을 만듭니다.
mysql> insert into DemoTable1561 values('Adam','Learning Java');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable1561 values('Bob','Learning C');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable1561 values('Adam','Learning Spring and Hibernate Framework');
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable1561 values('Carol','Learning MySQL from basic');
Query OK, 1 row affected (0.30 sec)3. 전체 레코드 확인
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select * from DemoTable1561;
위 쿼리는 다음과 같은 결과를 출력합니다.
+-------------+-----------------------------------------+
| StudentName | Title |
+-------------+-----------------------------------------+
| Adam | Learning Java |
| Bob | Learning C |
| Adam | Learning Spring and Hibernate Framework |
| Carol | Learning MySQL from basic |
+-------------+-----------------------------------------+
4 rows in set (0.00 sec)
'Adam'의 데이터가 두 개의 행으로 나뉘어 저장되어 있는 것을 확인할 수 있습니다.
4. GROUP_CONCAT()으로 중복 값 그룹화하기
이제 GROUP_CONCAT() 함수와 GROUP BY 절을 사용해 동일한 학생 이름을 기준으로 제목들을 하나의 행으로 병합합니다.
mysql> select StudentName,
group_concat(Title separator ',') as FormattedOutput
from DemoTable1561
group by StudentName;
실행 결과는 다음과 같습니다.
+-------------+-------------------------------------------------------+
| StudentName | FormattedOutput |
+-------------+-------------------------------------------------------+
| Adam | Learning Java,Learning Spring and Hibernate Framework |
| Bob | Learning C |
| Carol | Learning MySQL from basic |
+-------------+-------------------------------------------------------+
3 rows in set (0.00 sec)
결과 분석 및 추가 팁
위 결과에서 볼 수 있듯이, 'Adam'에 해당하는 두 개의 레코드가 하나의 행으로 병합되어 쉼표로 구분된 형식화된 문자열로 출력되었습니다. 전체 행 수도 4개에서 3개로 줄어든 것을 확인할 수 있습니다.
GROUP_CONCAT()은 다음과 같은 옵션도 지원하므로 상황에 맞게 활용하면 더욱 유용합니다.
- DISTINCT: 중복된 값을 제거하고 고유한 값만 병합합니다. 예:
GROUP_CONCAT(DISTINCT Title) - ORDER BY: 병합되는 값의 정렬 순서를 지정합니다. 예:
GROUP_CONCAT(Title ORDER BY Title ASC) - SEPARATOR: 기본 구분자인 쉼표 대신 원하는 구분자를 지정할 수 있습니다. 예:
SEPARATOR ' / '
이처럼 GROUP_CONCAT()을 활용하면 애플리케이션 단에서 추가 가공 없이도 데이터베이스 쿼리만으로 중복 값을 깔끔하게 그룹화된 형태로 가져올 수 있습니다.