Php MySQL中具有左右组的分层查询

Php MySQL中具有左右组的分层查询,php,mysql,hierarchical,Php,Mysql,Hierarchical,我有一个表,有两列username和leader login_user sponsered_id right_left test1 admin Right test2 admin Left test3 test1 Right test4 test1 Left test43 test2 Left

我有一个表,有两列username和leader

  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
test2   Left    admin

test3   Right   test1
test4   Left    test1

        Right   test2
test43  Left    test2

        Right   test3
test44  Left    test3
你可以试试这个

   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
试试这个

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

您声明的输出与数据库中的值不匹配:Right test2不存在。我认为你应该通过登录用户对结果进行排序,并且你应该非常接近你所说的输出。我想正如高所建议的,对结果集进行排序可能会给你带来更理想的输出。另外,我建议使用嵌套的集合模型层次数据,它更容易处理和遍历层次结构中的节点和分支。@Kao那是wt我的问题是某些值不在右边或左边,它应该显示为空白…thx以供回答。。。。但它给出了错误的输出,正如你们所看到的,test2和test3都不正确,但demo给出了错误的输出;输出错误?很像你的。是的,测试2没有右边,它不显示右边,它显示左边。我不明白你的意思,如果你看到测试43同时出现在右边和左边。。。这是错误的,因为“正确的测试2”是空白的,所以它应该在那里显示空白,它的工作。。。但是我可以使用WHERE-sponsered_id=吗?因为我需要根据sponsered_id进行输出???@Harinder,当然,您可以将它添加到最外层的WHERE子句中
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