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

MySQL에서 GROUP BY와 CASE를 활용해 그룹별 개수를 제한하는 방법

MySQL에서 GROUP BY 절을 사용하면 데이터를 특정 기준으로 묶어 개수를 집계할 수 있습니다. 여기에 CASE 문을 함께 활용하면, 일정 개수를 초과한 그룹은 실제 숫자 대신 '4보다 큼'처럼 원하는 문구로 표시할 수도 있습니다.

이 글에서는 예제 테이블을 만들고, 사용자별 메시지 수를 집계하면서 개수가 4개 이상이면 별도의 문자열로 출력하는 방법을 단계별로 살펴보겠습니다.

1. 예제 테이블 생성

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

mysql> create table DemoTable
(
    UserId int,
    UserMessage varchar(100)
);
Query OK, 0 rows affected (0.51 sec)

2. 샘플 데이터 삽입

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

mysql> insert into DemoTable values(1,'Hi');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable values(2,'Hello');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values(2,'Good');
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable values(1,'Nice');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values(1,'Awesome');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values(1,'Amazing');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values(1,'Good Morning');
Query OK, 1 row affected (0.12 sec)

3. 전체 데이터 확인

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

mysql> select *from DemoTable;

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

+--------+--------------+
| UserId | UserMessage  |
+--------+--------------+
|      1 | Hi           |
|      2 | Hello        |
|      2 | Good         |
|      1 | Nice         |
|      1 | Awesome      |
|      1 | Amazing      |
|      1 | Good Morning |
+--------+--------------+
7 rows in set (0.00 sec)

위 결과를 보면 UserId 1번 사용자는 메시지를 5개, UserId 2번 사용자는 2개 작성했습니다.

4. GROUP BY로 개수 집계 및 제한 표시하기

이제 GROUP BY로 사용자별 메시지 수를 집계하고, CASE 문을 이용해 개수가 4 미만일 때만 실제 숫자를 보여주고, 그렇지 않으면 'Greater Than 4'라는 문자열을 출력하는 쿼리를 작성합니다.

mysql> select UserId,
case when count(*) < 4 then count(*) else 'Greater Than 4' end as 'NumberOfMessage'
from DemoTable group by UserId;

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

+--------+-----------------+
| UserId | NumberOfMessage |
+--------+-----------------+
|      1 | Greater Than 4  |
|      2 | 2               |
+--------+-----------------+
2 rows in set (0.06 sec)

결과 해석

  • UserId 1: 메시지가 총 5개이므로 조건(count < 4)에 해당하지 않아 'Greater Than 4'가 표시됩니다.
  • UserId 2: 메시지가 총 2개이므로 실제 개수인 '2'가 그대로 출력됩니다.

이처럼 GROUP BY와 COUNT(*), CASE 문을 조합하면 그룹별 레코드 수를 집계하면서 동시에 특정 임계값을 넘는 경우 다른 형태로 표시할 수 있습니다. 게시판에서 사용자별 게시글 수를 요약하거나, 스팸 방지를 위해 과도한 활동량을 가린 표시할 때 유용하게 활용할 수 있습니다.