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

MySQL GROUP_CONCAT() 함수로 하나의 레코드에 그룹의 모든 항목 나열하기

GROUP_CONCAT() 함수란?

MySQL에서 GROUP_CONCAT() 함수를 사용하면 GROUP BY로 묶은 그룹에 속한 모든 항목을 하나의 레코드로 나열할 수 있습니다. 이 함수는 각 그룹의 문자열 값을 하나로 연결해 반환하는 집계 함수로, 기본 구분자는 콤마(,)입니다.

실제 동작을 확인하기 위해 먼저 테이블을 생성해 보겠습니다.

mysql> create table DemoTable
(
    ProductId int,
    ProductName varchar(40),
    ProductCategory varchar(40)
);
Query OK, 0 rows affected (0.67 sec)

테스트 데이터 삽입

insert 명령을 사용해 테이블에 몇 개의 레코드를 삽입합니다.

mysql> insert into DemoTable values(100,'Product-1','1Product');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values(101,'Product-2','2Product');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values(100,'Product-1','3Product');
Query OK, 1 row affected (0.14 sec)

전체 데이터 조회

select 문을 사용해 테이블의 모든 레코드를 조회하는 쿼리는 다음과 같습니다.

mysql> select *from DemoTable;

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

+-----------+-------------+-----------------+
| ProductId | ProductName | ProductCategory |
+-----------+-------------+-----------------+
| 100       | Product-1   | 1Product        |
| 101       | Product-2   | 2Product        |
| 100       | Product-1   | 3Product        |
+-----------+-------------+-----------------+
3 rows in set (0.00 sec)

그룹별 항목을 하나의 레코드로 나열하기

이제 GROUP_CONCAT() 함수를 활용해 그룹(ProductId)에 속한 모든 항목을 단일 레코드로 나열하는 쿼리를 작성해 보겠습니다.

mysql> select ProductId,group_concat(ProductCategory) AS `GROUP` FROM DemoTable group by ProductId;

실행 결과는 다음과 같습니다.

+-----------+-------------------+
| ProductId | GROUP             |
+-----------+-------------------+
| 100       | 1Product,3Product |
| 101       | 2Product          |
+-----------+-------------------+
2 rows in set (0.00 sec)

ProductId가 100인 레코드 두 개가 하나의 행으로 병합되어 '1Product,3Product' 형태로 출력된 것을 확인할 수 있습니다.

응용: 구분자 변경 및 정렬

GROUP_CONCAT()은 SEPARATOR 옵션으로 구분자를 자유롭게 지정할 수 있으며, ORDER BY 절을 함께 사용하면 연결되는 값의 순서도 정렬할 수 있습니다.

mysql> select ProductId,
       group_concat(ProductCategory order by ProductCategory separator '; ') AS `GROUP`
       FROM DemoTable group by ProductId;

또한 중복 값을 제거하고 싶다면 DISTINCT 키워드를 함께 사용하면 됩니다.

group_concat(DISTINCT ProductCategory)

이처럼 GROUP_CONCAT() 함수를 활용하면 여러 행에 흩어져 있는 그룹 데이터를 손쉽게 하나의 문자열로 집계할 수 있어, 목록형 데이터를 요약해서 보여줄 때 매우 유용합니다.