2013-03-24 3 views
0

У меня есть таблица с 2 столбцами именем и лидеромИерархические запросы в MySQL с Правыми левыми группами

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 
+0

Выход вы указывали doens't значения совпадают в базе данных: 'Правильный test2' doens' t существует. Я думаю, вы должны просто заказать их с помощью login_user, и вы должны приблизиться к выведенному вами выводу. – Kao

+0

Я думаю, как предложил Као, сортировка результатов может дать вам более желательный результат. Кроме того, я хотел бы рекомендовать использовать иерархические данные модели Nested Set, гораздо удобнее работать с ними и пересекать узлы и ветки в вашей иерархии. –

+0

@Kao thats wt мой вопрос - это некоторая ценность не в Right or Left, он должен отображать пустой ... – 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

thx его сработало ... но могу ли я использовать WHERE 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

thx для ответа .... но его отказ от неправильного вывода, так как вы можете видеть, что нет права на test2 и нет права на test3, но демо дает неправильный вывод для обоих: ( – Harinder

+0

неправильный вывод? exacly как ваш. yes test2 не имеет права, и он не показывает правду, он показывает слева. Я не понимаю, что означает u –

+0

, если вы видите test43, как правая, так и левая ... это неправильно, потому что «Правильный тест2» пуст, поэтому он должен показывать пустое место – Harinder