테스트 사이트 - 개발 중인 베타 버전입니다

쿼리문 depth 좀 봐주세요 채택완료

예서제이 3년 전 조회 1,063

</p>

<p>    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</p>

<p>        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</p>

<p>

 

도움을 받아서 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개

채택된 답변
+20 포인트

상위, 하위 select를 따로 해서

union하면 되지 않을까요?

로그인 후 평가할 수 있습니다

답변에 대한 댓글 2개

예서제이
3년 전
[code]
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;
[/code]

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

리스트로 뿌려지는 하위 값은 4부터 시작되고 있습니다.
엑스엠엘
3년 전
상위 하위 따로는
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를 바꾸시는 것이 가장 좋을 듯합니다.

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인