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

MySQL JOIN으로 두 컬럼 간 상호 관계가 있는 행 개수 구하기

MySQL에서 한 컬럼에 있는 값이 다른 컬럼에도 존재하는 등 상호 관계(mutual relation)가 있는 행의 개수를 구하려면 집계 함수 COUNT(*)와 셀프 조인(Self Join)을 함께 사용하면 됩니다. 이 글에서는 예제 테이블을 만들고 단계별로 쿼리를 작성하는 방법을 살펴보겠습니다.

1. 예제 테이블 생성

먼저 두 개의 정수 컬럼을 가진 테이블을 생성합니다.

mysql> create table DemoTable1543
    -> (
    -> Value1 int,
    -> Value2 int
    -> );
Query OK, 0 rows affected (1.36 sec)

2. 샘플 데이터 삽입

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

mysql> insert into DemoTable1543 values(57,60);
Query OK, 1 row affected (0.52 sec)
mysql> insert into DemoTable1543 values(60,68);
Query OK, 1 row affected (0.38 sec)
mysql> insert into DemoTable1543 values(90,98);
Query OK, 1 row affected (0.36 sec)
mysql> insert into DemoTable1543 values(98,90);
Query OK, 1 row affected (0.20 sec)

3. 저장된 데이터 확인

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

mysql> select * from DemoTable1543;

위 쿼리는 다음과 같은 결과를 출력합니다.

+--------+--------+
| Value1 | Value2 |
+--------+--------+
|     57 |     60 |
|     60 |     68 |
|     90 |     98 |
|     98 |     90 |
+--------+--------+
4 rows in set (0.00 sec)

4. 상호 관계가 있는 행 개수 세기

여기서 확인하고 싶은 것은 90이라는 값이 Value1과 Value2 양쪽에 서로 연결되어 존재하는지, 즉 (90, 98)과 (98, 90)처럼 순서만 바뀐 쌍이 있는 경우입니다.

이를 위해 같은 테이블을 자기 자신과 조인(셀프 조인)한 뒤, 첫 번째 별칭(tbl1)의 Value1이 90이고 조인된 두 번째 별칭(tbl2)의 Value2가 90이 되는 조건을 걸어 행 수를 세면 됩니다.

mysql> select count(*) from DemoTable1543 tbl1
    -> join DemoTable1543 tbl2
    -> on tbl1.Value2=tbl2.Value1
    -> where tbl1.Value1=90 and tbl2.Value2=90;

실행 결과

+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)

쿼리 동작 원리

  • tbl1.Value2 = tbl2.Value1: 첫 번째 행의 Value2 값과 일치하는 Value1 값을 가진 행을 찾아 연결합니다.
  • tbl1.Value1 = 90: 시작점이 되는 행의 Value1이 90인 경우만 대상으로 제한합니다.
  • tbl2.Value2 = 90: 연결된 행의 Value2 역시 90이어야 하므로, 90 → 98 → 90처럼 양방향으로 순환되는 관계만 최종적으로 남게 됩니다.

결과적으로 COUNT(*)가 1을 반환했으므로, 90을 포함하는 상호 관계(순환 쌍)가 하나 존재한다는 것을 확인할 수 있습니다. 이 방식은 특정 값뿐 아니라 WHERE 절 조건만 바꾸면 어떤 값에 대해서도 동일하게 응용할 수 있습니다.