MySQL에서 배열 요소와 일치하는 값 조회하기
MySQL에서 특정 값들의 집합(배열)과 모두 일치하는 레코드를 찾으려면 IN 절과 GROUP BY, HAVING COUNT(*)를 함께 활용하면 됩니다. 이번 글에서는 예제 테이블을 만들고, 지정한 값들이 모두 포함된 Id를 조회하는 방법을 단계별로 살펴보겠습니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable1523
-> (
-> Id int,
-> Value int
-> );
Query OK, 0 rows affected (0.76 sec)
2. 샘플 데이터 삽입하기
INSERT 문을 사용하여 테이블에 레코드를 추가합니다.
mysql> insert into DemoTable1523 values(1,56);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable1523 values(2,78);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable1523 values(1,34);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable1523 values(2,45);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable1523 values(1,99);
Query OK, 1 row affected (0.10 sec)
3. 전체 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select * from DemoTable1523;
실행하면 다음과 같은 결과가 출력됩니다.
+------+-------+
| Id | Value |
+------+-------+
| 1 | 56 |
| 2 | 78 |
| 1 | 34 |
| 2 | 45 |
| 1 | 99 |
+------+-------+
5 rows in set (0.00 sec)
4. 배열 요소와 일치하는 Id 조회하기
다음은 배열 요소를 일치시키는 핵심 쿼리입니다. 여기서는 값 34, 99, 56 세 가지가 모두 존재하는 Id를 선택합니다.
mysql> select Id from DemoTable1523
-> where Value IN ('34','99','56')
-> group by Id
-> having count(*)=3;
실행 결과는 다음과 같습니다.
+------+
| Id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
쿼리 동작 원리
이 쿼리가 작동하는 원리를 간단히 정리하면 다음과 같습니다.
WHERE Value IN ('34','99','56') : Value 컬럼이 목록에 있는 값 중 하나라도 일치하는 행만 필터링합니다.
GROUP BY Id : 일치하는 행들을 Id 기준으로 그룹화합니다.
HAVING COUNT(*) = 3 : 각 그룹에서 일치한 행의 개수가 정확히 3개(즉, 세 값이 모두 존재)인 경우만 최종 결과로 남깁니다.
위 예제에서 Id 1은 56, 34, 99 세 값을 모두 가지고 있어 결과에 포함되었지만, Id 2는 해당 값들과 일치하는 데이터가 없으므로 제외된 것입니다. 만약 일치해야 하는 값의 개수가 달라진다면 HAVING 절의 숫자만 그에 맞게 조정하면 됩니다.