【问题标题】:Hierarchical queries in MySQL with Right Left GroupsMySQL中具有左右组的分层查询
【发布时间】:2013-03-13 22:48:01
【问题描述】:

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

【问题讨论】:

  • 您所说的输出与数据库中的值不匹配:Right test2 不存在。我认为您应该只通过 login_user 订购它们,并且您应该非常接近您所说的输出。
  • 我想正如 Kao 所建议的,对结果集进行排序可能会给您带来更理想的输出。另外,我想推荐使用嵌套集模型层次结构数据,它更容易使用和遍历层次结构中的槽节点和分支。
  • @Kao 那就是我的问题是某些值不在左右,它应该显示空白......

标签: php mysql hierarchical


【解决方案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

【讨论】:

  • 感谢它的工作......但我可以使用 WHERE sponsered_id= 这个因为我需要根据 sponsered_id 的输出??
  • @Harinder,当然,你可以在最外面的where子句中添加它
【解决方案2】:

你可以试试这个

   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

【讨论】:

  • 感谢回复 .... 但它给出了错误的输出,因为你可以看到 test2 上没有权利,而 test3 上没有权利,但演示为两者都提供了错误的输出;(
  • 输出错误?和你的一模一样。是的 test2 没有权利,它不显示正确,它显示左。我不明白你的意思
  • 如果你看到 test43 出现在左右两边......这是错误的,因为“Right test2”是空白的,所以它应该在那里显示空白
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多