MySQL에서 여러 행의 값을 하나의 행으로 합치기
MySQL에서 여러 개의 행(row)에 나뉘어 저장된 값들을 쉼표로 구분된 단일 행으로 변환하고 싶다면 GROUP_CONCAT() 함수와 CONCAT() 함수를 함께 사용하면 됩니다.
GROUP_CONCAT()은 그룹화된 여러 행의 값을 하나의 문자열로 연결해 주는 집계 함수이고, CONCAT()은 각 값 앞뒤에 원하는 문자(예: 대괄호)를 붙이는 데 활용할 수 있습니다.
1. 예제 테이블 생성
먼저 실습용 테이블을 생성합니다.
mysql> create table DemoTable1807
(
Id int
);
Query OK, 0 rows affected (0.00 sec)2. 데이터 삽입
INSERT 문을 사용해 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable1807 values(101); Query OK, 1 row affected (0.00 sec) mysql> insert into DemoTable1807 values(102); Query OK, 1 row affected (0.00 sec) mysql> insert into DemoTable1807 values(103); Query OK, 1 row affected (0.00 sec)
3. 전체 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select * from DemoTable1807;
실행 결과는 다음과 같습니다.
+------+ | Id | +------+ | 101 | | 102 | | 103 | +------+ 3 rows in set (0.00 sec)
현재까지는 값들이 세 개의 행으로 나뉘어 있는 상태입니다.
4. GROUP_CONCAT과 CONCAT으로 한 줄로 변환
이제 GROUP_CONCAT()과 CONCAT()을 조합한 쿼리를 실행해 보겠습니다.
mysql> select group_concat(concat('[',Id,']')) from DemoTable1807;실행 결과는 다음과 같습니다.
+----------------------------------+
| group_concat(concat('[',Id,']')) |
+----------------------------------+
| [101],[102],[103] |
+----------------------------------+
1 row in set (0.00 sec)결과 설명
위 쿼리가 동작하는 원리를 살펴보면 다음과 같습니다.
CONCAT('[', Id, ']')는 각 행의 Id 값 앞뒤에 대괄호를 붙여 [101], [102], [103] 형태로 만듭니다. 이어서 GROUP_CONCAT()이 이 값들을 기본 구분자인 쉼표(,)로 연결하여 최종적으로 [101],[102],[103]이라는 하나의 문자열을 반환합니다.
만약 구분자를 다른 문자로 바꾸고 싶다면 GROUP_CONCAT(concat('[',Id,']') SEPARATOR ';')처럼 SEPARATOR 옵션을 지정하면 됩니다. 또한 대량의 데이터를 처리할 때는 group_concat_max_len 시스템 변수의 기본값(1024바이트)이 결과를 잘라낼 수 있으므로 필요에 따라 값을 늘려주는 것이 좋습니다.