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

MySQL에서 중복 데이터를 찾아 한 줄로 표시하는 방법 (GROUP_CONCAT 활용)

MySQL에서 특정 컬럼의 중복된 값들을 찾아 한 줄에 함께 표시하고 싶다면 GROUP_CONCAT() 함수와 GROUP BY 절을 함께 사용하면 됩니다. 이 두 가지를 조합하면 중복 항목들을 그룹으로 묶어 하나의 행에 나열할 수 있습니다.

1. 테이블 생성하기

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

mysql> create table DemoTable
(
    StudentFavouriteSubject varchar(40),
    StudentName varchar(40)
) ;
Query OK, 0 rows affected (0.75 sec)

위 쿼리는 학생이 좋아하는 과목(StudentFavouriteSubject)과 학생 이름(StudentName) 두 개의 컬럼을 가진 테이블을 만듭니다.

2. 샘플 데이터 삽입하기

INSERT 명령을 사용해 몇 개의 레코드를 추가합니다.

mysql> insert into DemoTable values('MySQL','Chris');
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable values('MongoDB','Bob');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values('MySQL','Sam');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values('Java','Mike');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('C','Carol');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values('MongoDB','John');
Query OK, 1 row affected (0.18 sec)

3. 전체 레코드 확인하기

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

mysql> select *from DemoTable;

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

+-------------------------+-------------+
| StudentFavouriteSubject | StudentName |
+-------------------------+-------------+
| MySQL                   | Chris       |
| MongoDB                 | Bob         |
| MySQL                   | Sam         |
| Java                    | Mike        |
| C                       | Carol       |
| MongoDB                 | John        |
+-------------------------+-------------+
6 rows in set (0.00 sec)

결과를 보면 'MySQL' 과목은 Chris와 Sam, 'MongoDB' 과목은 Bob과 John처럼 동일한 과목이 여러 번 등장하는 것을 확인할 수 있습니다.

4. 중복 항목을 찾아 한 줄로 표시하기

이제 GROUP_CONCAT() 함수와 GROUP BY 절을 사용하여 중복된 과목별로 학생 이름을 한 줄로 묶어 출력하는 쿼리입니다.

mysql> select group_concat(StudentName),StudentFavouriteSubject from DemoTable
group by StudentFavouriteSubject;

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

+---------------------------+-------------------------+
| group_concat(StudentName) | StudentFavouriteSubject |
+---------------------------+-------------------------+
| Carol                     | C                       |
| Mike                      | Java                    |
| Bob,John                  | MongoDB                 |
| Chris,Sam                 | MySQL                   |
+---------------------------+-------------------------+
4 rows in set (0.00 sec)

쿼리 설명

GROUP BY StudentFavouriteSubject가 과목별로 레코드를 그룹화하고, GROUP_CONCAT(StudentName)이 각 그룹에 속한 학생 이름들을 쉼표(,)로 구분하여 하나의 문자열로 연결해 줍니다.

그 결과 'MongoDB' 과목에는 Bob과 John이, 'MySQL' 과목에는 Chris와 Sam이 각각 한 줄에 함께 표시되어 중복 데이터를 손쉽게 파악할 수 있습니다.

추가 팁

GROUP_CONCAT()는 기본적으로 쉼표로 값을 구분하지만, SEPARATOR 옵션을 사용하면 원하는 구분자를 지정할 수 있습니다. 예를 들어 group_concat(StudentName SEPARATOR ' / ')처럼 작성하면 이름들이 슬래시(/)로 구분되어 표시됩니다.