2013-03-24 3 views
0

나는 2 열 이름과 리더계층 적 쿼리는

login_user sponsered_id right_left 
    test1  admin   Right 
    test2  admin   Left 
    test3  test1   Right 
    test4  test1   Left 
    test43  test2   Left 
    test44  test3   Left 

내가

function display_children($parent, $level) { 

    // retrieve all children of $parent 

    $result = mysql_query('SELECT name, login_user, right_left FROM members_list '. 

          'WHERE sponsered_id="'.$parent.'";'); 


    while ($row = mysql_fetch_array($result)) { 

     // indent and display the title of this child 


    echo '<tr><td>'. 
    $row['login_user'].' </td><td> '.$row['right_left'].' </td><td> '.$row['sponsered_id']. 
    "</td></tr>"; 


     // call this function again to display this 

     // child's children 

     display_children($row['login_user'], $level+1); 

    } 

} 

echo display_children('admin',0); 

하지만 잘 출력을 점점 기능이 .... 그주는 테이블이

로 나 출력

test1 Right admin 
test3 Right test1 
test44 Left test3 
test4 Right test1 
test2 Left admin 
test43 Left test2 

필요 출력 `오른쪽 test2`의 doens '

test1 Right admin 
test2 Left admin 

test3 Right test1 
test4 Left test1 

     Right test2 
test43 Left test2 

     Right test3 
test44 Left test3 
+0

당신이 넣은 사람은 아니다 일치하는 데이터베이스의 값을 언급 출력을 시도하려고 할 수 있습니다 존재하지 않습니다. 나는 당신이 login_user에 의해 그것들을 주문해야한다고 생각하고, 당신이 진술 한 결과물에 꽤 가까이 가야한다. – Kao

+0

카오 (Kao)가 제안했듯이 결과 세트를 정렬하면 더 바람직한 결과를 얻을 수 있습니다. 또한 중첩 세트 모델의 계층 구조 데이터를 사용하는 것이 좋습니다. 계층 구조에서 노드 및 분기를 통과하고 트래버스하는 것이 훨씬 쉽습니다. –

+0

@ 카오 내 질문에 무게는 일부 값은 오른쪽 또는 왼쪽되지 않습니다, 그것은 공백을 표시해야합니다 ... – Harinder

답변

1

SELECT 
    login_user, 
    right_left, 
    sponsered_id 
FROM (
    SELECT 
     login_user, 
     right_left, 
     sponsered_id 
    FROM 
     members_list 

    UNION 

    SELECT 
     NULL, 
     CASE when max(right_left) ='Left' THEN 'Right' ELSE 'Left' END AS right_left, 
     sponsered_id 
    FROM 
     members_list 
    GROUP BY 
     sponsered_id 
    HAVING count(sponsered_id) < 2 
) as temp 
ORDER BY 
    sponsered_id, 
    right_left 
+0

그 일을 ...하지만 내가 sponsered_id에 따라 출력이 필요로 어디서 sponsered_id = 사용할 수 있습니까 ?? – Harinder

+0

@ Harinder, 물론, 가장 바깥 쪽 부분에 추가 할 수 있습니다 – Akash

+0

@Harinder 대답을 수락하십시오 – Akash

0

select login_user , right_left , sponsered_id from (

    select login_user , right_left , sponsered_id 
    from members_list 
    union all 

    select login_user , if(right_left ='left', 'right', 'right') right_left , sponsered_id 
    from members_list 

)t 
    group by sponsered_id, right_left 
    order by login_user 

DEMO HERE

+0

답장을위한 ....하지만 그것으로 잘못된 출력을 볼 수있는 권리가 test2와 오른쪽에 없습니다 test3에 있지만 데모 모두에 대한 잘못된 출력을주고있다 ( – Harinder

+0

잘못된 출력? exacly 너 같은 것입니다. 예 test2 권리가없고 오른쪽 표시, 왼쪽 보여줍니다. 내가 무슨 뜻인지 이해가 안돼 –

+0

test43 참조하십시오 모두 오른쪽과 왼쪽 ...이 잘못된 것은 '오른쪽 test2'비어 있기 때문에 거기에 공백이 표시되어야합니다 – Harinder