쿼리문 depth 좀 봐주세요

쿼리문 depth 좀 봐주세요

QA

쿼리문 depth 좀 봐주세요

본문


    select  a.mb_id, a.wr_name, b.mb_name, a.wr_29, b.mb_level, b.mb_1, count(*) as cnt , sum(a.wr_23) as tot, depth
            from {$write_table} a
            inner join    (
        select        mb_id,
                    mb_name,
                    mb_level,
                if( mb_id is null, 0, 0) depth
                    from    {$g5['member_table']}
                    where    mb_id='{$main_id}'
            union
        select
                    p1.mb_id,
                    p1.mb_name,
                    p1.mb_level,
            if( p2.mb_id is null, 1, if( p3.mb_id is null, 2, if( p4.mb_id is null, 3, if( p5.mb_id is null, 4, if( p6.mb_id is null, 5, if( p7.mb_id is null, 6, if( p8.mb_id is null, 7, if( p9.mb_id is null, 8, 9)))))))) depth
        from        {$g5['member_table']} p1
        left join   {$g5['member_table']} p2 on p2.mb_id = p1.mb_9
        left join   {$g5['member_table']} p3 on p3.mb_id = p2.mb_9
        left join   {$g5['member_table']} p4 on p4.mb_id = p3.mb_9
        left join   {$g5['member_table']} p5 on p5.mb_id = p4.mb_9
        left join   {$g5['member_table']} p6 on p6.mb_id = p5.mb_9
        left join   {$g5['member_table']} p7 on p7.mb_id = p6.mb_9
        left join   {$g5['member_table']} p8 on p8.mb_id = p7.mb_9
        left join   {$g5['member_table']} p9 on p9.mb_id = p8.mb_9
        where       '{$main_id}' in (p1.mb_9, p2.mb_9, p3.mb_9, p4.mb_9, p5.mb_9,  p6.mb_9,  p7.mb_9,  p8.mb_9,  p9.mb_9)
        ) as b on a.mb_id = b.mb_id
        where wr_29 between '{$stx1}' and '{$stx2}'
        group by mb_id
        order by depth

 

도움을 받아서 depth까지는 나옵니다.

 

문제는 $main_id를 기준으로 1,2,3 이렇게 나오는게 아니라

무조건 최상위부터  depth 가 나옵니다.

 

예를들어 

owner 아이디로 했을때

"aaaa"가 2뎁스, 

"bbbb"가 3뎁스 이고..

그 하위 "cccc" 가 4뎁스인데

 

$main_id 를 bbbb 로 뿌렸을때도 "cccc"의 depth 가 4뎁스로 표기가 됩니다.

무조건 최상위 owner가 기준이 되고 있습니다.

 

$main_id 를 기준으로 depth 를 1,2,3 이렇게 표시할려면 어떻게 수정해야 하나요?

이 질문에 댓글 쓰기 :

답변 1

상위, 하위 select를 따로 해서

union하면 되지 않을까요?


select      
            p1.mb_id as mb_id,
            p1.mb_name,
			if( p2.mb_id is null, 1,
			if( p3.mb_id is null, 2,
			if( p4.mb_id is null, 3,
			if( p5.mb_id is null, 4,
			if( p6.mb_id is null, 5,
			if( p7.mb_id is null, 6,
			if( p8.mb_id is null, 7,
			if( p9.mb_id is null, 8, 9)))))))) depth
from        {$g5['member_table']} p1
left join   {$g5['member_table']} p2 on p2.mb_id = p1.mb_9
left join   {$g5['member_table']} p3 on p3.mb_id = p2.mb_9
left join   {$g5['member_table']} p4 on p4.mb_id = p3.mb_9
left join   {$g5['member_table']} p5 on p5.mb_id = p4.mb_9
left join   {$g5['member_table']} p6 on p6.mb_id = p5.mb_9
left join   {$g5['member_table']} p7 on p7.mb_id = p6.mb_9
left join   {$g5['member_table']} p8 on p8.mb_id = p7.mb_9
left join   {$g5['member_table']} p9 on p9.mb_id = p8.mb_9
where       'test' in (p1.mb_9,
						   p2.mb_9,
						   p3.mb_9,
						   p4.mb_9,
						   p5.mb_9,
						   p6.mb_9,
						   p7.mb_9,
						   p8.mb_9,
						   p9.mb_9)
order       by depth,  mb_name;


하위만 따로 select 했는데도.. depth 가 1이 나오질 않습니다.
어떻게 해도.. 최 상위로부터 depth가 나오고 있습니다.
test라는 아이디가 최 상위로부터 3인데..

리스트로 뿌려지는 하위 값은 4부터 시작되고 있습니다.

상위 하위 따로는
select ... where      'test' in (p1.mb_9)
union
select ... where 'test' in (p9.mb_9)
이렇게 되는 것을 생각했는데, 이건 안 되네요.

select 1 depth, ... from ( select ... where      'test' in (p1.mb_9) ) A1
union
select 2 depth, ... from ( select ... where      'test' in (p2.mb_9) ) A2
union
select 3 depth, ... from ( select ... where      'test' in (p3.mb_9) ) A3
...
이렇게 되어야겠네요.

하지만 너무 복잡해지므로
DB를 바꾸시는 것이 가장 좋을 듯합니다.

답변을 작성하시기 전에 로그인 해주세요.
전체 167
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT