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

MySQL GROUP_CONCAT로 중복 레코드를 고유한 쉼표 구분 목록으로 표시하는 방법

중복 데이터를 정리하면서 각 항목의 값을 하나의 목록으로 묶어야 할 때가 있습니다. 이럴 때 GROUP_CONCAT() 함수를 사용하면 여러 행의 값을 쉼표로 구분된 단일 문자열로 손쉽게 변환할 수 있으며, DISTINCT 키워드를 함께 사용하면 중복된 값까지 제거한 고유한 목록을 얻을 수 있습니다.

1. 샘플 테이블 생성

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

mysql> create table DemoTable(
   Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
   Name varchar(40),
   Score int
);
Query OK, 0 rows affected (0.53 sec)

2. 레코드 삽입

INSERT 문을 사용해 의도적으로 중복이 포함된 레코드들을 입력합니다.

mysql> insert into DemoTable(Name,Score) values('Chris',56);
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable(Name,Score) values('Robert',78);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable(Name,Score) values('Chris',56);
Query OK, 1 row affected (0.42 sec)
mysql> insert into DemoTable(Name,Score) values('Bob',89);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(Name,Score) values('Chris',56);
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable(Name,Score) values('Chris',57);
Query OK, 1 row affected (0.13 sec)

3. 전체 데이터 확인

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

mysql> select *from DemoTable;

아래 출력 결과에서 볼 수 있듯이 'Chris'라는 이름이 여러 번 반복되며, 특히 점수 56은 동일하게 중복되어 저장되어 있습니다.

+----+--------+-------+
| Id | Name   | Score |
+----+--------+-------+
|  1 | Chris  |    56 |
|  2 | Robert |    78 |
|  3 | Chris  |    56 |
|  4 | Bob    |    89 |
|  5 | Chris  |    56 |
|  6 | Chris  |    57 |
+----+--------+-------+
6 rows in set (0.00 sec)

4. GROUP_CONCAT와 DISTINCT로 중복 제거하기

이제 GROUP BY와 함께 GROUP_CONCAT(DISTINCT ...)를 사용하여 각 이름별로 중복 없는 점수 목록을 만들어 보겠습니다.

mysql> select Name, group_concat(DISTINCT Score separator ',') from DemoTable group by Name;

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

+--------+--------------------------------------------+
| Name   | group_concat(DISTINCT Score separator ',') |
+--------+--------------------------------------------+
| Bob    | 89                                         |
| Chris  | 56,57                                      |
| Robert | 78                                         |
+--------+--------------------------------------------+
3 rows in set (0.00 sec)

'Chris'의 경우 원래 세 개의 레코드(56, 56, 57)가 있었지만, DISTINCT 덕분에 중복된 56이 제거되고 "56,57"이라는 고유한 값 목록만 반환된 것을 확인할 수 있습니다.

핵심 포인트 정리

  • GROUP_CONCAT(): 그룹별로 여러 행의 값을 하나의 문자열로 연결합니다.
  • DISTINCT: 그룹 내에서 중복된 값을 제거하여 고유한 값만 남깁니다.
  • SEPARATOR ',': 기본 구분자도 쉼표이지만, 명시적으로 지정하면 의도를 더 분명하게 드러낼 수 있습니다.

이처럼 GROUP_CONCAT과 DISTINCT를 조합하면 중복 데이터를 효율적으로 정리하고, 각 항목별 값을 깔끔한 쉼표 구분 목록 형태로 표현할 수 있습니다.