개요
MySQL에서 특정 열을 기준으로 데이터를 그룹화하고, 같은 그룹에 속한 다른 열의 여러 레코드를 하나의 필드에 구분 기호와 함께 표시하려면 GROUP_CONCAT() 함수와 GROUP BY 절을 함께 사용하면 됩니다.
GROUP_CONCAT()는 여러 행(row)에 흩어져 있는 데이터를 하나의 문자열로 연결해 주는 집계 함수입니다. 기본 구분 기호는 콤마(,)이지만, SEPARATOR 옵션을 사용하면 슬래시(/) 등 원하는 구분 기호를 자유롭게 지정할 수 있습니다.
1. 샘플 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable
(
PlayerId int,
ListOfPlayerName varchar(30)
);
Query OK, 0 rows affected (0.52 sec)2. 데이터 삽입
INSERT 명령어를 사용해 몇 개의 레코드를 삽입합니다.
mysql> insert into DemoTable values(100,'Chris'); Query OK, 1 row affected (0.13 sec) mysql> insert into DemoTable values(101,'David'); Query OK, 1 row affected (0.12 sec) mysql> insert into DemoTable values(100,'Bob'); Query OK, 1 row affected (0.11 sec) mysql> insert into DemoTable values(100,'Sam'); Query OK, 1 row affected (0.13 sec) mysql> insert into DemoTable values(102,'Carol'); Query OK, 1 row affected (0.19 sec) mysql> insert into DemoTable values(101,'Tom'); Query OK, 1 row affected (0.12 sec) mysql> insert into DemoTable values(102,'John'); Query OK, 1 row affected (0.12 sec)
3. 전체 레코드 확인
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+----------+------------------+ | PlayerId | ListOfPlayerName | +----------+------------------+ | 100 | Chris | | 101 | David | | 100 | Bob | | 100 | Sam | | 102 | Carol | | 101 | Tom | | 102 | John | +----------+------------------+ 7 rows in set (0.00 sec)
현재 PlayerId가 100인 선수는 3명, 101과 102에는 각각 2명씩 저장되어 있습니다.
4. GROUP BY와 GROUP_CONCAT()로 그룹화
이제 한 열(PlayerId)을 기준으로 그룹화하고, 같은 ID를 가진 선수 이름들을 슬래시(/) 구분 기호로 연결하여 표시하는 쿼리입니다.
mysql> select PlayerId,group_concat(ListOfPlayerName separator '/') as AllPlayerNameWithSameId from DemoTable
group by PlayerId;실행 결과는 다음과 같습니다.
+----------+-------------------------+ | PlayerId | AllPlayerNameWithSameId | +----------+-------------------------+ | 100 | Chris/Bob/Sam | | 101 | David/Tom | | 102 | Carol/John | +----------+-------------------------+ 3 rows in set (0.00 sec)
정리
위 예시처럼 GROUP_CONCAT()에 SEPARATOR 옵션을 지정하면, 동일한 PlayerId를 가진 여러 개의 이름이 'Chris/Bob/Sam' 형태로 하나의 필드에 깔끔하게 출력됩니다. 이 방법은 태그 목록, 카테고리 집계, 주문 상품 요약 등 여러 행의 값을 한 줄로 보여줘야 하는 다양한 상황에서 유용하게 활용할 수 있습니다.