그룹화된 데이터 중에서 다른 열 값과 함께 가장 많은 개수(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 DESC와LIMIT 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번 나타나 가장 많은 빈도를 기록했기 때문에, 해당 그룹만 최종 결과로 반환된 것을 확인할 수 있습니다.