Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL GROUP_CONCAT()로 한 열 기준 그룹화 후 구분 기호를 사용해 다른 열 값 한 번에 표시하는 방법

개요

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' 형태로 하나의 필드에 깔끔하게 출력됩니다. 이 방법은 태그 목록, 카테고리 집계, 주문 상품 요약 등 여러 행의 값을 한 줄로 보여줘야 하는 다양한 상황에서 유용하게 활용할 수 있습니다.