MySQL 계층형쿼리 질문드립니다. 0 2 998

by xcrew [SQL Query] mySQL 계층쿼리 [2019.04.11 15:37:08]


안녕하세요. MySQL에서 계층쿼리를 해보고 있는데요.

tf_idfolder tf_userid tf_foldername tf_parent tf_seq
1 1 기밀유지계약 0 1
2 1 대외비 1 1
3 1 동의서 1 2
4 1 노동계약서 0 2
5 1 근로계약서 0 3
6 1 테스트1 4 1
7 1 테스트2 4 2

 

위의 데이터를 쿼리로 한게 아래와 같습니다.

SELECT CONCAT( REPEAT( ' ', (COUNT(parent.tf_foldername) - 1) ), node.tf_foldername) AS name
FROM templete_forder AS node,
     templete_forder AS parent
WHERE node.tf_parent BETWEEN parent.tf_parent AND parent.tf_idfolder
GROUP BY node.tf_foldername, node.tf_parent; 

그런데 결과값이 노동계약서 밑에 테스트1, 테스트2가 나와야하는데 맨밑에 나와 버리네요....

뎁스는 2단계 까지입니다.

'  기밀유지계약'
'    대외비'
'    동의서'
'  노동계약서'
'  근로계약서'
'   테스트1'
'   테스트2'
 

도움 부탁드립니다.

by 마농 [2019.04.11 16:22:02]

조인 조건이 이상하네요?
단순 2레벨 이므로 그냥 이퀄조인하면 되는데, 이상하게 비트윈 조인했네요.
자식과 부모를 조인할 때 최상위는 부모가 없으니 아우터 조인하면 되구요.
조인 후 정렬만 신경써서 해주면 될 것 같네요.

WITH templete_forder AS
(
SELECT 1 tf_idfolder, 1 tf_userid, '기밀유지계약' tf_foldername, 0 tf_parent, 1 tf_seq
UNION ALL SELECT 2, 1, '대외비'      , 1, 1
UNION ALL SELECT 3, 1, '동의서'      , 1, 2
UNION ALL SELECT 4, 1, '노동계약서'  , 0, 2
UNION ALL SELECT 5, 1, '근로계약서'  , 0, 3
UNION ALL SELECT 6, 1, '테스트1'     , 4, 1
UNION ALL SELECT 7, 1, '테스트2'     , 4, 2
)
SELECT node.tf_idfolder
     , node.tf_userid
     , CONCAT(LPAD(' ', SIGN(node.tf_parent)*2, ' '), node.tf_foldername) tf_foldername
     , node.tf_parent
     , node.tf_seq
     , SIGN(node.tf_parent) lv                  -- 레벨
     , IFNULL(parent.tf_seq, node.tf_seq) p_seq -- 부모정렬
  FROM templete_forder node
  LEFT OUTER JOIN templete_forder parent
    ON node.tf_parent = parent.tf_idfolder
 ORDER BY p_seq, lv, tf_seq
;

 


by xcrew [2019.04.11 16:25:56]

감사합니다~~~~~!

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