mysql中的父子关系

时间:2011-12-01 12:24:28

标签: php mysql hierarchical-data

我有一个像下面这样的表,需要显示为父和子格式

--------------------------------------------------------
    id   role_name   role_id   parent_id
--------------------------------------------------------
    1     NSM           1        0
    2     MR            5        2
    3     ASM           4        3
    4     ZSM           3        4
    5     RSM           2        1
---------------------------------------------------------

结果就像是以下

NSM
  ---RSM
     -----ZSM
          -----NSM
               -----MR

NSM->ROOT
 RSM->FIRST CHILD
  ZSM->SECOND CHILD
   NSM->THIRD CHILD
    MR->LEAF

3 个答案:

答案 0 :(得分:4)

// Fetch all the roles
$result = mysql_query("select * from roles");
$roles = array();
while( $role = mysql_fetch_assoc($result) ) {
    $roles[] = $role;
}

// Function that builds a tree
function build_tree($roles, $parent_id=0) {
    $tree = array();
    foreach ($roles as $role) {
        if ($role['parent_id'] == $parent_id) {
            $tree[] = array(
                'role' => $role,
                'children' => build_tree($roles, $role['parent_id'])
            );
        }
    }

    return $tree;
}

// Function that walks and outputs the tree
function print_tree($tree) {
    if (count($tree) > 0) {
        print("<ul>");
        foreach($node in $tree) {
            print("<li>");
            htmlspecialchars($node['role']['role_name']);
            print_tree($node['children']);
            print("</li>");
        }
        print("</ul>");
    }
}

答案 1 :(得分:0)

SQL结果总是持平的 - 您将无法在查询中返回该数据的层次结构视图。

相反,我建议使用你用来表示它的任何客户端组件(它是一棵树吗?究竟是什么?)知道如何通过一个平面列表并构建一个层次结构。

答案 2 :(得分:0)

如果你想在控制台中打印这样的视图(你为什么要这样做?),你可以这样做:

$data = array();
$query = mysql_query("SELECT * FROM table ORDER BY parent_id");
while($array = mysql_fetch_assoc($query))
{
  $data[$array['parent_id']][] = $array;
}

function output_hierarchy($id, $prepend)
{
  $current = $data[$id];
  foreach($current as $item)
  {
    print $prepend . " " . $item['role_name'];
    if(count($data[$item['id']]) > 0)
    {
      output_hierarchy($item['id'], $prepend . "--");
    }
  }
}

output_hierarchy(0, '');

如果您想在您的网站上使用它,您可以轻松地进行调整。代码应该是不言自明的。