使用右左组的MySQL中的分层查询

时间:2013-03-24 11:54:50

标签: php mysql hierarchical

我有一个包含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

需要输出

test1   Right   admin
test2   Left    admin

test3   Right   test1
test4   Left    test1

        Right   test2
test43  Left    test2

        Right   test3
test44  Left    test3

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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