MySQL에서 GROUP BY 절과 GREATEST(), LEAST() 함수를 함께 사용하면 두 열에 걸쳐 나타나는 값의 발생 횟수를 손쉽게 집계할 수 있습니다. 이 방법은 열의 순서와 관계없이 동일한 값 쌍을 하나의 그룹으로 묶어 처리한다는 점이 핵심입니다.
1. 샘플 테이블 생성
먼저 예제로 사용할 테이블을 생성합니다.
mysql> create table DemoTable
-> (
-> Name1 varchar(20),
-> Name2 varchar(20)
-> );
Query OK, 0 rows affected (0.61 sec)
2. 데이터 삽입
INSERT 명령을 사용해 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable values('John','Adam');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('Chris','David');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values('Robert','Mike');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values('David','Chris');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('Mike','Robert');
Query OK, 1 row affected (0.18 sec)3. 전체 레코드 확인
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+--------+--------+
| Name1 | Name2 |
+--------+--------+
| John | Adam |
| Chris | David |
| Robert | Mike |
| David | Chris |
| Mike | Robert |
+--------+--------+
5 rows in set (0.00 sec)
4. 두 열의 발생 횟수를 구하는 쿼리
아래 쿼리는 GREATEST()와 LEAST() 함수를 활용해 두 이름을 사전순으로 정렬한 뒤 그룹화함으로써, 순서가 뒤바뀐 쌍도 같은 그룹으로 인식하도록 만듭니다.
mysql> select greatest(Name1,Name2),least(Name1,Name2),count(*) as Occurrences from DemoTable
-> group by greatest(Name1,Name2),least(Name1,Name2);
실행 결과는 다음과 같습니다.
+-----------------------+--------------------+-------------+
| greatest(Name1,Name2) | least(Name1,Name2) | Occurrences |
+-----------------------+--------------------+-------------+
| John | Adam | 1 |
| David | Chris | 2 |
| Robert | Mike | 2 |
+-----------------------+--------------------+-------------+
3 rows in set (0.02 sec)
결과 해석
출력 결과를 보면 'Chris'와 'David'는 (Chris, David), (David, Chris) 두 행으로 저장되어 있지만, GREATEST()와 LEAST() 덕분에 하나의 쌍으로 묶여 발생 횟수 2회로 집계되었습니다. 마찬가지로 'Robert'와 'Mike'도 2회로 계산된 것을 확인할 수 있습니다.
이처럼 GREATEST()/LEAST() + GROUP BY 조합은 두 열에 흩어져 있는 값을 순서에 구애받지 않고 비교·집계해야 하는 상황(예: 친구 관계, 매칭 데이터 분석 등)에서 매우 유용하게 활용됩니다.