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

MySQL GROUP BY로 그룹별 전체 행 한 줄로 합치기 – GROUP_CONCAT() 완벽 가이드

MySQL에서 그룹별로 모든 행을 하나로 나열하는 방법

MySQL에서 GROUP BY를 사용할 때 각 그룹에 속한 여러 행의 값을 하나의 문자열로 합쳐서 보고 싶은 경우가 자주 있습니다. 이럴 때 유용하게 쓸 수 있는 함수가 바로 GROUP_CONCAT()입니다.

이 글에서는 예제 테이블을 만들고, GROUP_CONCAT()을 활용해 그룹별로 모든 행을 나열하는 방법을 단계별로 살펴보겠습니다.

1단계: 테이블 생성하기

먼저 예제에 사용할 테이블을 생성합니다.

mysql> create table DemoTable
    (
    Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    Name varchar(20),
    Value varchar(100)
    );
Query OK, 0 rows affected (0.62 sec)

2단계: 데이터 삽입하기

INSERT 명령어를 사용해 테이블에 레코드를 추가합니다.

mysql> insert into DemoTable(Name,Value) values('John','John');
Query OK, 1 row affected (0.15 sec)

mysql> insert into DemoTable(Name,Value) values('Carol','Carol');
Query OK, 1 row affected (0.21 sec)

mysql> insert into DemoTable(Name,Value) values('John','Works');
Query OK, 1 row affected (0.13 sec)

mysql> insert into DemoTable(Name,Value) values('Carol','Works');
Query OK, 1 row affected (0.22 sec)

mysql> insert into DemoTable(Name,Value) values('John','At');
Query OK, 1 row affected (0.15 sec)

mysql> insert into DemoTable(Name,Value) values('Carol','At');
Query OK, 1 row affected (0.16 sec)

mysql> insert into DemoTable(Name,Value) values('John','Amazon');
Query OK, 1 row affected (0.15 sec)

mysql> insert into DemoTable(Name,Value) values('Carol','Google');
Query OK, 1 row affected (0.16 sec)

3단계: 저장된 데이터 확인하기

SELECT 문으로 테이블의 전체 레코드를 조회해 보겠습니다.

mysql> select *from DemoTable;

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

+----+-------+--------+
| Id | Name  | Value  |
+----+-------+--------+
| 1  | John  | John   |
| 2  | Carol | Carol  |
| 3  | John  | Works  |
| 4  | Carol | Works  |
| 5  | John  | At     |
| 6  | Carol | At     |
| 7  | John  | Amazon |
| 8  | Carol | Google |
+----+-------+--------+
8 rows in set (0.00 sec)

4단계: GROUP_CONCAT()으로 그룹별 행 나열하기

이제 이름(Name)별로 값을 하나의 문자열로 합치는 쿼리를 실행해 보겠습니다. 'John'의 경우 Id가 1, 3, 5, 7인 행들의 값이 합쳐져 "John Works At Amazon"이라는 결과가 만들어집니다. 마찬가지 방식으로 'Carol'도 처리됩니다.

mysql> select Name, GROUP_CONCAT(Value SEPARATOR ' ') AS `Complete_Status` from DemoTable group by Name;

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

+-------+-----------------------+
| Name  | Complete_Status       |
+-------+-----------------------+
| Carol | Carol Works At Google |
| John  | John Works At Amazon  |
+-------+-----------------------+
2 rows in set (0.00 sec)

GROUP_CONCAT() 핵심 포인트 정리

  • SEPARATOR 옵션: 기본 구분자는 콤마(,)이며, 위 예제처럼 SEPARATOR ' '를 지정하면 공백으로 값들을 연결할 수 있습니다.
  • ORDER BY 활용: GROUP_CONCAT(Value ORDER BY Id)처럼 작성하면 그룹 내 값들이 정렬된 순서로 연결됩니다.
  • DISTINCT 중복 제거: GROUP_CONCAT(DISTINCT Value)를 사용하면 중복된 값은 한 번만 포함됩니다.
  • 길이 제한 주의: 기본적으로 group_concat_max_len 시스템 변수(기본값 1024바이트)로 결과 길이가 제한되므로, 긴 문자열을 다룰 때는 이 값을 조정해야 할 수 있습니다.

이처럼 GROUP_CONCAT() 함수를 사용하면 GROUP BY로 묶인 그룹의 모든 행 값을 손쉽게 하나의 문자열로 변환할 수 있어, 요약 리포트나 목록형 데이터를 만들 때 매우 유용합니다.