Oracle의 계층형쿼리(Connect By Prior~)를 MySQL로 대체하여 표현해보자~
ex) 계층구조를 갖는 메뉴데이터를 계층쿼리로 표현
-------- 테이블 생성
CREATE TABLE 'tb_addr' (
'a_idx' INT NOT NULL AUTO_INCREMENT COMMENT '주소번호',
'a_pidx' INT NOT NULL COMMENT '부모 주소번호',
'a_title' VARCHAR(100) NOT NULL COMMENT '주소명'
PRIMARY KEY ('a_idx')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-------- 쿼리(메뉴 계층구조 표현 및 정렬)
SELECT
o_title, a_idx, IFNULL(lTB.a_pidx, 0) as a_pidx, IFNULL(cnt, 0) as sub_cnt, path
FROM(
WITH RECURSIVE tmp1 AS
(
SELECT
a_idx, a_title, a_title as o_title, a_pidx,
a_title AS path,
CONCAT(a_idx,',',a_title) AS sort_str,
1 AS lvl
FROM tb_addr WHERE a_pidx is null
UNION ALL
SELECT
e.a_idx, e.a_title, e.a_title as o_title, e.a_pidx,
CONCAT(t.path,'/',e.a_title) AS path,
CONCAT(t.sort_str,'>',CONCAT(e.a_idx,',',e.a_title)) AS sort_str,
t.lvl+1 AS lvl
FROM tmp1 t
JOIN tb_addr e
ON t.a_idx = e.a_pidx
)
SELECT
CONCAT(REPEAT(' ', lvl*4), a_title) as a_title, o_title,
a_idx, a_pidx,
path, sort_str, lvl
FROM tmp1
) lTB
LEFT JOIN(
select a_pidx, count(a_pidx) as cnt from tb_addr group by a_pidx
) AS rTB
ON(lTB.a_idx = rTB.a_pidx)
ORDER BY sort_str
'Database > MySQL' 카테고리의 다른 글
MySQL 그룹별 시퀀스 번호 지정하기 (0) | 2020.11.18 |
---|---|
MySQL 특정날짜 사이의 월 목록 가져오기 (0) | 2020.11.04 |
MySQL 가로데이터를 세로데이터로 전환하기 (0) | 2020.10.23 |
MySQL 특정날짜 사이의 날짜 목록 가져오기 (0) | 2020.10.20 |