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

MySQL 단일 쿼리로 여러 행을 쉼표로 구분된 목록으로 합치는 방법

GROUP_CONCAT() 함수란?

여러 개의 행(row)을 쉼표로 구분된 하나의 목록으로 합치려면 MySQL의 GROUP_CONCAT() 함수를 사용하면 됩니다. 이 함수는 GROUP BY 절과 함께 사용하여, 같은 그룹에 속한 여러 행의 값을 하나의 문자열로 연결해 줍니다.

1. 테이블 생성하기

먼저 예제로 사용할 테이블을 만들어 보겠습니다.

mysql> create table DemoTable
(
    Id int,
    Name varchar(40)
);
Query OK, 0 rows affected (0.52 sec)

2. 데이터 삽입하기

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

mysql> insert into DemoTable values(100,'Chris Brown');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values(101,'Adam Smith');
Query OK, 1 row affected (0.84 sec)
mysql> insert into DemoTable values(101,'John Doe');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values(100,'David Miller');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values(101,'Carol Taylor');
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable values(103,'Bob Taylor');
Query OK, 1 row affected (0.20 sec)

3. 전체 레코드 확인하기

SELECT 문으로 테이블의 모든 레코드를 조회합니다.

mysql> select *from DemoTable;

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

+------+--------------+
| Id   | Name         |
+------+--------------+
|  100 | Chris Brown  |
|  101 | Adam Smith   |
|  101 | John Doe     |
|  100 | David Miller |
|  101 | Carol Taylor |
|  103 | Bob Taylor   |
+------+--------------+
6 rows in set (0.00 sec)

4. GROUP_CONCAT()으로 행 합치기

다음은 행을 쉼표로 구분된 목록으로 합치는 쿼리입니다.

mysql> select Id,group_concat(Name) from DemoTable group by Id;

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

+------+----------------------------------+
| Id   | group_concat(Name)               |
+------+----------------------------------+
|  100 | Chris Brown,David Miller         |
|  101 | Adam Smith,John Doe,Carol Taylor |
|  103 | Bob Taylor                       |
+------+----------------------------------+
3 rows in set (0.00 sec)

위 결과에서 볼 수 있듯이, 동일한 Id를 가진 이름들이 하나의 쉼표로 구분된 문자열로 묶였습니다.

활용 팁

GROUP_CONCAT() 함수는 다음과 같은 유용한 옵션도 함께 제공합니다.

  • DISTINCT: 중복된 값을 제거하고 연결합니다. 예: GROUP_CONCAT(DISTINCT Name)
  • ORDER BY: 연결되는 값의 순서를 정렬합니다. 예: GROUP_CONCAT(Name ORDER BY Name ASC)
  • SEPARATOR: 기본 구분자인 쉼표(,) 대신 원하는 구분자를 지정할 수 있습니다. 예: GROUP_CONCAT(Name SEPARATOR ' / ')

또한 결과 문자열의 최대 길이는 group_concat_max_len 시스템 변수(기본값 1024바이트)에 의해 제한되므로, 대량의 데이터를 처리할 때는 이 값을 조정해 주는 것이 좋습니다.