MySQL에서 쉼표로 구분된 값의 개수를 세는 방법
데이터베이스에 저장된 쉼표로 구분된 값(CSV 형식) 중에서 특정 값이 포함된 행의 개수를 확인하고 싶다면, 집계 함수 COUNT(*)와 FIND_IN_SET() 함수를 함께 사용하면 됩니다.
FIND_IN_SET() 함수는 첫 번째 인자로 전달한 값이 두 번째 인자(쉼표로 구분된 문자열) 내에 존재하면 해당 위치를 반환하고, 존재하지 않으면 0을 반환합니다. 이 특성을 활용하면 원하는 값을 손쉽게 검색할 수 있습니다.
1단계: 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable
(
Value varchar(100)
);
Query OK, 0 rows affected (0.49 sec)2단계: 데이터 삽입하기
INSERT 명령어를 사용하여 쉼표로 구분된 값들을 저장합니다.
mysql> insert into DemoTable values('10,20,60,80');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('60,70,90');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('50,55,65,60');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('90,98,97');
Query OK, 1 row affected (0.12 sec)3단계: 저장된 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
위 쿼리는 다음과 같은 결과를 출력합니다.
+-------------+ | Value | +-------------+ | 10,20,60,80 | | 60,70,90 | | 50,55,65,60 | | 90,98,97 | +-------------+ 4 rows in set (0.00 sec)
4단계: FIND_IN_SET()으로 특정 값 개수 세기
이제 '60'이라는 값이 포함된 행의 개수를 세는 쿼리를 실행해 보겠습니다.
mysql> select count(*) from DemoTable
where find_in_set('60',Value) > 0;실행 결과는 다음과 같습니다.
+----------+ | count(*) | +----------+ | 3 | +----------+ 1 row in set (0.00 sec)
결과 분석
결과를 보면 '60'이 포함된 행은 총 3개입니다. 각 행을 살펴보면 다음과 같습니다.
- 10,20,60,80 → '60' 포함 ✓
- 60,70,90 → '60' 포함 ✓
- 50,55,65,60 → '60' 포함 ✓
- 90,98,97 → '60' 미포함 ✗
주목할 점은 네 번째 행의 '97'처럼 숫자에 '6'과 '0'이 포함되어 있어도 FIND_IN_SET()은 정확히 일치하는 값만 찾는다는 것입니다. 즉, 부분 문자열이 아닌 쉼표로 구분된 개별 항목 단위로 정확하게 매칭됩니다. 만약 LIKE '%60%'를 사용했다면 '960' 같은 값도 잘못 매칭될 수 있으므로, 쉼표로 구분된 값을 검색할 때는 FIND_IN_SET()을 사용하는 것이 훨씬 안전하고 정확합니다.