Search code examples
phpmysqlhierarchical

Hierarchical queries in MySQL with Right Left Groups


I have a table with 2 columns username and 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

I have a function

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);

But not getting right output .... its giving me output

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

need output as

test1   Right   admin
test2   Left    admin

test3   Right   test1
test4   Left    test1

        Right   test2
test43  Left    test2

        Right   test3
test44  Left    test3

Solution

  • Try this

    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