[MariaDB] 재귀쿼리를 활용한 트리구조 메뉴 만들기 RECURSIVE

2022. 5. 30. 20:05· WEB
반응형

댓글이나 메뉴를 구현하기위해 트리구조로 데이터를 뽑아와야하는 경우가 있다.

이럴때 테이블에 필요한 필수 컬럼과 재귀쿼리를 이용해 데이터를 가지고 오는 방법을 설명하겠다.

 

category 테이블 구성 컬럼 정보

  • cateId : 카테고리의 고유 아이디
  • cateNmae : 카테고리 이름
  • firstDate : 생성 날짜
  • cateDeletFlag : 삭제 유무
  • parentId : 부모 카테고리 아이디

 

트리구조로 메뉴 데이터를 가지고 오는 재귀쿼리

  • WITH RECURSIVR tree AS() : 메모리상에 tree라는 가상의 테이블을 생성한다.
  • UNION ALL을 기준으로 위에나오는 SELECT문은 비 반복문 으로써 재귀쿼리에 기준이 된다. 여기서는 cateId = 'al'인 데이터가 기준이 된다.
  • UNION ALL을 기준으로 아래에 나오는 SELECT문에서 가상의 테이블인 tree를 사용해 재귀쿼리를 호출한다.
  • 조건을 걸지 않으면 무한으로 돌기 때문에 꼭 종료 조건을 걸어줘야 한다. 여기서는 자신의 cateId를 parentId로 가지는 row가 없을 시 종료가 된다.
  • orderString : 정렬을 위해 생성해 주는 컬럼이다.
  • depth : 출력 시 UI를 형성에 편리함을 위해 생성해주는 컬럼이다.
WITH RECURSIVE  tree AS(
	SELETC 
		cateId,
		cateName,
		parentId,
		cateId AS orderString,
		0 AS depth
		FROM category
		WHERE cateId = 'al'
	
	UNION ALL
	
	SELECT 
		cate1.cateId,
		cate1.cateName,
		cate1.parentId,
		CONCAT(cate2.orderString,', ' ,  cate1.cateId) AS orderString,
		cate2.depth + 1 AS depth
		FROM category AS cate1
		INNER JOIN tree AS cate2
		ON cate1.parentId = cate2.cateId
	
)
SELECT *
FROM tree
order by orderString

 

단계별 실행 결과 

1. 테이블 category에서 cateId가 'al'인 행을 가상의 테이블 tree에 행으로 넣는다. 

테이블 tree

2. 테이블 category에서 parentId가 'al'인 행을(1의 결과) 가상의 테이블 tree에 행으로 넣는다. 

 

3. 테이블 category에서 parentId가 'da', 'en', 'ga', 'hu', 'it', 'sh' 인 행을(2의 결과) 가상의 테이블 tree에 행으로 넣는다.

3. 테이블 category에서 parentId가 'c', 'fo', 'ja', 'tr'인 행을(3의 결과) 가상의 테이블 tree에 행으로 넣는다.

4. 테이블 category에서 parentId가 'am', 'ko', 'op'인 행을(3의 결과) 가상의 테이블 tree에 행으로 넣는다.

결과

테이블 category에서 parentId가 'la'인 행이(4의 결고) 없으므로 쿼리는 종료된다. 이후 orderString으로 정렬하면 트리형 구조로 데이터를 가지고 올 수있다.

반응형
저작자표시 비영리 변경금지 (새창열림)

'WEB' 카테고리의 다른 글

[HTML JQuery] 페이지 로딩중 이미지 만들기 부터 적용까지  (0) 2022.06.09
[Html] 부트스트랩 a태그 밑줄 지우기  (0) 2022.06.04
[Nuxt.js] Component간 데이터 바인딩 props, $emit 을 이용한 popUp구현  (0) 2022.05.27
[mySQL/mariaDB] PK 없는 테이블 중복 데이터 삭제  (0) 2022.03.25
MySQL 특정 아이디로 컬럼 합치기 #GROUP_CONCAT  (1) 2022.02.18
'WEB' 카테고리의 다른 글
  • [HTML JQuery] 페이지 로딩중 이미지 만들기 부터 적용까지
  • [Html] 부트스트랩 a태그 밑줄 지우기
  • [Nuxt.js] Component간 데이터 바인딩 props, $emit 을 이용한 popUp구현
  • [mySQL/mariaDB] PK 없는 테이블 중복 데이터 삭제
TaeHuiLee
TaeHuiLee
창업, 사업, 자기개발, 운동, Web, App, Java, python, 이슈, 개발자, JavaScript, amazon, cloud server, 취업, 스펙, Android Studio, Spring, React, Node.js, 구독하면 댓글 남겨주세요.
TaeHuiLee
Developer_TaeHui
TaeHuiLee
  • 분류 전체보기 (228)
    • WEB (71)
    • Java (38)
    • APP (17)
    • 딥러닝 (2)
    • DB (5)
    • 알고리즘 (17)
    • Python (10)
    • AWS (5)
    • Git (8)
    • Docker (13)
    • 창업 (2)
    • Java Script (5)
    • 군집드론 (3)
    • C언어 (1)
    • IT 지식 (16)
    • Rust (1)
    • Tomcat (1)
    • Nginx (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • WSL
  • spring boot
  • 선택정렬
  • 수원역 맛집
  • 관상 어플
  • 정렬
  • 티스토리챌린지
  • mariadb
  • 수원 맛집
  • VUE
  • 알고리즘
  • github
  • 파이썬
  • 오블완
  • 자바
  • Queue
  • docker
  • javascript
  • ubuntu
  • 도커
  • python
  • Java
  • axios
  • 강릉 맛집
  • DB
  • 어플
  • Nuxt
  • GIT
  • Spring
  • 서울 맛집

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
TaeHuiLee
[MariaDB] 재귀쿼리를 활용한 트리구조 메뉴 만들기 RECURSIVE
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.