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

MySQL에서 그룹별 최대 개수를 가진 레코드 조회하는 방법 (GROUP BY & HAVING)

그룹화된 데이터 중에서 다른 열 값과 함께 가장 많은 개수(count)를 가진 레코드를 조회하려면 GROUP BY 절과 HAVING 절을 함께 사용하면 됩니다. 아래 예제를 통해 단계별로 살펴보겠습니다.

1단계: 테이블 생성

먼저 데모용 테이블을 생성합니다.

mysql> create table DemoTable
(
    Value int
);
Query OK, 0 rows affected (0.54 sec)

2단계: 레코드 삽입

INSERT 명령을 사용해 테이블에 여러 개의 레코드를 추가합니다. 의도적으로 동일한 값(88)을 여러 번 삽입하여 중복 데이터 상황을 만듭니다.

mysql> insert into DemoTable values(88);
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable values(88);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values(88);
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable values(99);
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable values(99);
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable values(99);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values(99);
Query OK, 1 row affected (0.07 sec)
mysql> insert into DemoTable values(100);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values(100);
Query OK, 1 row affected (0.07 sec)
mysql> insert into DemoTable values(88);
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values(88);
Query OK, 1 row affected (0.11 sec)

3단계: 전체 레코드 확인

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

mysql> select *from DemoTable;

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

+-------+
| Value |
+-------+
|    88 |
|    88 |
|    88 |
|    99 |
|    99 |
|    99 |
|    99 |
|   100 |
|   100 |
|    88 |
|    88 |
+-------+
11 rows in set (0.00 sec)

4단계: 최대 개수를 가진 그룹 조회

아래 쿼리는 그룹별 레코드 수를 계산한 뒤, 그중 개수가 가장 많은 값만 필터링하여 출력합니다. 동작 원리는 다음과 같습니다.

  • GROUP BY Value로 각 값별 개수를 집계합니다.
  • 서브쿼리에서 ORDER BY NumberOfCount DESCLIMIT 1을 사용해 가장 큰 개수를 구합니다.
  • HAVING 절로 전체 개수가 서브쿼리 결과와 같은 그룹만 남깁니다.
mysql> select Value,count(*) as NumberOfCount
   from DemoTable
   group by Value
   having count(*)=(select count(*) as NumberOfCount
      from DemoTable
      group by Value
      order by NumberOfCount desc
      limit 1);

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

+-------+---------------+
| Value | NumberOfCount |
+-------+---------------+
|    88 |             5 |
+-------+---------------+
1 row in set (0.00 sec)

결과를 보면 값 88이 총 5번 나타나 가장 많은 빈도를 기록했기 때문에, 해당 그룹만 최종 결과로 반환된 것을 확인할 수 있습니다.