안녕하세요. 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'
도움 부탁드립니다.
조인 조건이 이상하네요?
단순 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 ;