Database/Mysql

[MySQL] 계층형 재귀 쿼리

펌킨고구마 2022. 2. 14. 14:35
728x90
반응형

계층형 구조(Hierarchical Structure) 는

부모와 자식 간의 관계를 깊이로 구분하여 표현하는 것으로 트리구조, 보통 카테고리를 분류나 조직도에 많이 사용된다.

 

오라클이였으면, 

START WITH ... CONNECT BY 를 사용하여 계층형 쿼리를 작성할 수 있다.

 

 

문제는 내가 지금 작업해야하는 곳의 DB가 MYSQL 이라는것.....

 

찾아보다가 발견한 사이트. 덕분에 원하는건 해결했다.

참고사이트 : https://isolution.pro/ko/q/so33213542/mysql-gyecheung-jeog-jaegwi-kwolileul-mandeuneun-bangbeob

 

 

dept_no dept_name parent_no
1 부서 0
2 부서1 1
3 부서2 1
4 부서3 2

내가 가지고 있던 테이블은 위의 표와 같은 식으로 이루어져있고, 

내가 필요한 값은 단순하게 dept_no 만 나오면 되는걸로,

dept_no 가 1인 값을 조회하면 그의 자식과 자식의 자식인 2,3,4 의 dept_no가 조회되면 된다.

 

 

검색해보면 WITH RECURSIVE 문을 사용하라는 것이 많이 나온다.

그래서 나도 사용해보았지만 안되었다. 왜그럴까 했더니

with recursive cte (dept_no, name, parent_no) as (
  select     dept_no,
              name,
             parent_no
  from       depts
  where      parent_no = 1
  union all
  select     d.dept_no,
             d.name,
             d.parent_id
  from       depts d
  inner join cte
          on d.parent_no = cte.dept_no
)
select * from cte;

위의 WITH구문은 MySQL 8버전이상부터 사용 가능하다고 한다. 

 

하필 내가 사용하는 MySQL은 버전이 5.7 이하다. 

즉 위의 방식은 사용 못한다는 거지..

 

일단은 여기 설명에 나온 것처럼 

SELECT  dept_no
FROM    (select * FROM depts
         order by parent_no, dept_no) depts,
        (select @pv := '65') initialization
WHERE   find_in_set(parent_no, @pv)
AND     length(@pv := concat(@pv, ',', dept_no))

위와 같이 작성하였다.

 

위에 사이트에선 추천하진 않는 것 같다.

다른 방법이 있는지 더 찾아보아야겠다..

 

728x90
반응형
LIST