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

MySQL에서 같은 행에 중복 레코드의 개수와 ID 목록을 함께 표시하는 방법

MySQL에서 특정 컬럼의 값이 중복되는 레코드들을 하나의 행으로 그룹화하고, 각 그룹에 속한 레코드의 개수와 함께 해당 ID 목록까지 한 번에 확인해야 하는 경우가 있습니다. 이럴 때 GROUP_CONCAT(), COUNT() 함수와 GROUP BY, HAVING 절을 함께 사용하면 손쉽게 해결할 수 있습니다.

1. 테이블 생성하기

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

mysql> create table DemoTable
-> (
-> CompanyId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> CompanyName varchar(20)
-> );
Query OK, 0 rows affected (0.62 sec)

2. 샘플 데이터 삽입하기

INSERT 명령을 사용하여 회사 이름이 일부러 중복되도록 여러 레코드를 삽입합니다.

mysql> insert into DemoTable(CompanyName) values('Amazon');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable(CompanyName) values('Google');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable(CompanyName) values('Google');
Query OK, 1 row affected (0.07 sec)
mysql> insert into DemoTable(CompanyName) values('Microsoft');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable(CompanyName) values('Amazon');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable(CompanyName) values('Amazon');
Query OK, 1 row affected (0.07 sec)

3. 전체 레코드 조회하기

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

mysql> select *from DemoTable;

위 쿼리는 다음과 같은 결과를 출력합니다.

+-----------+-------------+
| CompanyId | CompanyName |
+-----------+-------------+
| 1 |Amazon |
| 2 |Google |
| 3 |Google |
| 4 |Microsoft |
| 5 |Amazon |
| 6 |Amazon |
+-----------+-------------+
6 rows in set (0.00 sec)

4. 중복 레코드를 한 행에 그룹화하여 개수 표시하기

이제 GROUP_CONCAT()으로 각 회사명에 해당하는 CompanyId 값들을 하나의 문자열로 묶고, COUNT()로 레코드 수를 집계한 뒤, HAVING 절을 통해 두 번 이상 등장하는(즉, 중복되는) 항목만 필터링합니다.

mysql> select CompanyName,group_concat(CompanyId),count(CompanyId) as count from DemoTable
-> group by CompanyName
-> having count > 1;

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

+-------------+-------------------------+-------+
| CompanyName | group_concat(CompanyId) | count |
+-------------+-------------------------+-------+
| Amazon | 1,5,6 | 3 |
| Google | 2,3 | 2 |
+-------------+-------------------------+-------+
2 rows in set (0.00 sec)

결과 해석

출력 결과를 보면 'Amazon'은 CompanyId가 1, 5, 6인 세 개의 레코드로 중복되어 있고, 'Google'은 CompanyId가 2, 3인 두 개의 레코드로 중복되어 있는 것을 한눈에 확인할 수 있습니다. 반면 한 번만 등장한 'Microsoft'는 HAVING 조건에 의해 결과에서 제외됩니다.

이처럼 GROUP_CONCAT()과 COUNT()를 GROUP BY 절과 함께 활용하면, 중복된 데이터를 그룹별로 한 행에 정리하면서 각 그룹의 레코드 개수까지 동시에 표시할 수 있어 데이터 검증이나 중복 분석 작업에 매우 유용합니다.