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 ' / ')처럼 작성하면 이름들이 슬래시(/)로 구분되어 표시됩니다.