MYSQL 콤마로 구분하여 개수 세는 문제 질문 0 5 4,051

by 튼실맨 [SQL Query] MYSQL 개수 [2024.05.21 17:48:54]


예를 들어 데이터가

컬럼이

1 한국,중국,일본

2 한국

3 중국,일본

4 대만,한국

이런식으로 콤마로 구분되어 저장되어있을 떄

각각의 개수를 구하고 싶은데

한국 : 3

이런식으로요 

어떻게 쿼리는 작성해야 할까요? 

FIND_IN_SET() 함수를 사용해보려했는데 자제하는게 좋다고 하여 생각 중입니다.

 

by 마농 [2024.05.22 01:43:44]
WITH t AS
(
SELECT 1 id, '한국,중국,일본' v
UNION ALL SELECT 2, '한국'
UNION ALL SELECT 3, '중국,일본'
UNION ALL SELECT 4, '대만,한국'
)
, copy_t AS
(
SELECT 1 lv
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
UNION ALL SELECT 5
UNION ALL SELECT 6
UNION ALL SELECT 7
UNION ALL SELECT 8
UNION ALL SELECT 9
)
SELECT X
     , COUNT(*) cnt
  FROM (SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(v, ',', lv), ',', -1) x
          FROM t
             , copy_t
         WHERE lv <= LENGTH(v) - LENGTH(REPLACE(v, ',', '')) + 1
        ) a
 GROUP BY x
;

 


by 튼실맨 [2024.05.22 14:16:50]

데이터가 좀 많은 경우에는 어떻게 하나요??

지금 데이터가 숫자로 예시를 들자면

1

1,3

2,4,5

5,6,7

2,6,7

...

이렇게 계속해서 데이터가 추가되는 상황입니다. 

 


by 우주민 [2024.05.22 14:44:55]

현재 마농님께서 답변하신 쿼리는 그런 경우를 모두 포함한 내용인듯 합니다.

row 에 상관은 없고, 단지 한 컬럼에 최대 9개의 데이터가 콤마로 구분될 경우를 산정해 처리하신듯 하네요.


by 마농 [2024.05.22 15:09:24]

1. WITH t 부분은
- 테스트 용도로 적은 것입니다.
- 실제 테이블로 대체하여 적용해 보시면 됩니다.
2. copy_t 부분은
- 1행의 자료를 여러행으로 분류할 때 이용되는데 최대 9개까지 가능하도록 한 것입니다.
- 9개 넘어가는 자료 있으면 유니온 좀더 늘려주시면 됩니다.
- 혹시 MariaDB 의 경우라면 seq_1_to_9 로 대체 가능하구요.


by 튼실맨 [2024.05.22 16:27:48]

아하 이해했습니다!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입