SQL 질문과 답변 게시판
안녕하세요.
쿼리문 때문에 머리가 지끈 지끈 하네요.. 흑..
우선 DB 는 mysql 입니다..
테이블 구조는 아래와 같이 되어 있습니다.
kind level selfid parentid name
0 0 1 0 Root
0 1 2 1 Menu_A
0 1 3 1 Menu_B
0 1 4 1 Menu_C
1 2 5 2 Value_1
1 2 6 2 Value_2
1 2 7 2 Value_3
0 2 8 4 Menu_C_A
0 3 9 8 Menu_C_A_A
0 3 10 8 Menu_C_A_B
0 1 11 1 Menu_D
테이블은 위처럼 되어 있는데요..
Level에 제한은 없구요..
아래 형태로 데이타를 뽑고 싶습니다..
Root
- Menu_A
- Menu_B
- Value_1
- Value_2
- Value_3
- Menu_C
- Menu_C_A
- Menu_C_A_A
- Menu_C_A_B
- Menu_D
조언 좀 해주세요.. ㅠㅠ 이거땜시 이틀동안 머리가 지끈 지끈 하네요..
쿼리로 해결이 안되니.. php에서 배열로 받아와서 지지고 볶고해서 표현하기 직전입니다.. ㅜㅜ


RECURSIVE 구조로 되어 있는 경우
트리 구조로 표현하기 위해서는 OLAP 툴을 사용한다면 어렵지 않겠지만 (MSTR은 RECURSIVE구조를 지원안함..ㅡㅡ)
쿼리결과값으로 표현을 할 경우
정렬만 잘 한다면 금방 해결되리라 생각합니다.
우선, (각 레벨 ~ 최상위레벨)값을 가져와서 최상위레벨부터 시퀀스번호를 주어서 정렬을 하면 해결이 됩니다.
뭐, 더 좋은 방법이 있겠지만 ㅋㅋ
그리고,
네임결과를 쿼리로 들여쓰기를 했는데, 어플리케이션에서 해결을 한다면 LV값에다 적당히 값을 주어 들여쓰기를 하면 될꺼 같습니다.
(PS. MENU_B에 VALUE_1~3까지 하위값이 있는데 VALUE_1~3의 상위값은 MENU_A로 수정해야 합니다.)
--테이블값 생성
CREATE TABLE RECURSIVE (
KIND INT,
LV INT,
SELFID INT,
PARENTID INT,
NAME VARCHAR(10) );
--값 입력
INSERT INTO RECURSIVE
SELECT 0,0,1,0,'ROOT' UNION ALL
SELECT 0,1,2,1,'MENU_A' UNION ALL
SELECT 0,1,3,1,'MENU_B' UNION ALL
SELECT 0,1,4,1,'MENU_C' UNION ALL
SELECT 1,2,5,2,'VALUE_1' UNION ALL
SELECT 1,2,6,2,'VALUE_2' UNION ALL
SELECT 1,2,7,2,'VALUE_3' UNION ALL
SELECT 0,2,8,4,'MENU_C_A' UNION ALL
SELECT 0,3,9,8,'MENU_C_A_A' UNION ALL
SELECT 0,3,10,8,'MENU_C_A_B' UNION ALL
SELECT 0,1,11,1,'MENU_D' ;
SELECT
SELFID,
CASE WHEN LV=1 THEN ' -'+NAME
WHEN LV=2 THEN ' -'+NAME
WHEN LV=3 THEN ' -'+NAME
ELSE NAME END NAME
FROM (
SELECT
SELFID,LV ,NAME,
SELFID*10000000 ORD
--레벨 1*10000000
FROM RECURSIVE R
WHERE LV=0
UNION ALL
SELECT
SELFID,LV ,NAME,
PARENTID*10000000 + SELFID*100000
--레벨 1*10000000 + 레벨2*100000
FROM RECURSIVE R
WHERE LV=1
UNION ALL
SELECT SELFID,LV ,NAME,
(SELECT PARENTID FROM RECURSIVE P WHERE LV=1 AND P.SELFID=R.PARENTID) *10000000 + PARENTID*100000 + SELFID*1000
--레벨 1*10000000 + 레벨2*100000 + 레벨3*1000
FROM RECURSIVE R
WHERE LV=2
UNION ALL
SELECT
SELFID,LV ,NAME,
(SELECT (SELECT PARENTID FROM RECURSIVE WHERE LV=1 AND SELFID=P.PARENTID)
FROM RECURSIVE P WHERE LV=2 AND P.SELFID=R.PARENTID) * 10000000
+ (SELECT PARENTID FROM RECURSIVE P WHERE LV=2 AND P.SELFID=R.PARENTID) *100000
+ PARENTID*1000 + SELFID*10 ORD
--레벨 1*10000000 + 레벨2*100000 + 레벨3*1000 + 레벨4*10
FROM RECURSIVE R
WHERE LV=3 ) RECUR
ORDER BY ORD;