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

MySQL에서 여러 열에 GROUP BY와 MAX를 함께 사용하는 방법

MySQL에서 여러 열을 대상으로 GROUP BYMAX 함수를 함께 사용하는 방법을 이해하기 위해, 먼저 예제 테이블을 생성해 보겠습니다.

1. 테이블 생성하기

아래 쿼리로 테이블을 생성합니다.

mysql> create table GroupByMaxDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> CategoryId int,
-> Value1 int,
-> Value2 int
-> );
Query OK, 0 rows affected (0.68 sec)

2. 데이터 삽입하기

INSERT 명령을 사용하여 테이블에 샘플 레코드를 추가합니다.

mysql> insert into GroupByMaxDemo(CategoryId, Value1,Value2) values(10,100,50);
Query OK, 1 row affected (0.15 sec)
mysql> insert into GroupByMaxDemo(CategoryId, Value1,Value2) values(10,100,70);
Query OK, 1 row affected (0.21 sec)
mysql> insert into GroupByMaxDemo(CategoryId, Value1,Value2) values(10,50,100);
Query OK, 1 row affected (0.22 sec)
mysql> insert into GroupByMaxDemo(CategoryId, Value1,Value2) values(20,180,150);
Query OK, 1 row affected (0.19 sec)

3. 전체 레코드 조회하기

SELECT 문을 사용하여 테이블의 모든 레코드를 확인합니다.

mysql> select *from GroupByMaxDemo;

출력 결과

+----+------------+--------+--------+
| Id | CategoryId | Value1 | Value2 |
+----+------------+--------+--------+
|  1 |         10 |    100 |     50 |
|  2 |         10 |    100 |     70 |
|  3 |         10 |     50 |    100 |
|  4 |         20 |    180 |    150 |
+----+------------+--------+--------+
4 rows in set (0.00 sec)

4. 여러 열에 GROUP BY와 MAX 적용하기

여기서 목표는 각 카테고리(CategoryId)별로 Value1의 최댓값을 구하고, 그중 Value2가 가장 큰 값까지 함께 조회하는 것입니다. 단순히 GROUP BY만 사용하면 원하는 결과를 얻기 어렵기 때문에, 서브쿼리와 INNER JOIN을 활용한 방식을 사용합니다.

다음은 여러 열에 GROUP BY와 MAX를 적용하는 쿼리입니다.

mysql> select tbl2.CategoryId, tbl2.Value1, max(tbl2.Value2)
-> from
-> (
-> select CategoryId, max(Value1) as `Value1`
-> from GroupByMaxDemo
-> group by CategoryId
-> ) tbl1
-> inner join GroupByMaxDemo tbl2 on tbl2.CategoryId = tbl1.CategoryId and tbl2.Value1 = tbl1.Value1
-> group by tbl2.CategoryId, tbl2.Value1;

출력 결과

+------------+--------+------------------+
| CategoryId | Value1 | max(tbl2.Value2) |
+------------+--------+------------------+
|         10 |    100 |               70 |
|         20 |    180 |              150 |
+------------+--------+------------------+
2 rows in set (0.00 sec)

쿼리 동작 원리 살펴보기

위 쿼리는 두 단계로 나누어 동작합니다.

첫 번째 단계(서브쿼리 tbl1): CategoryId별로 Value1의 최댓값을 계산합니다. 카테고리 10에서는 100, 카테고리 20에서는 180이 됩니다.

두 번째 단계(조인 및 그룹화): 서브쿼리 결과를 원본 테이블과 조인하여, 각 카테고리에서 Value1이 최댓값인 행들만 남깁니다. 이후 CategoryId와 Value1 기준으로 다시 그룹화하면서 Value2의 최댓값을 구합니다.

그 결과, 카테고리 10에서는 Value1이 100인 행 중 Value2의 최댓값인 70이, 카테고리 20에서는 180과 150이 반환됩니다. 이처럼 서브쿼리와 조인을 결합하면 MySQL에서 여러 열에 대한 최댓값 집계를 정확하게 수행할 수 있습니다.