mysql中的父子关系


Parent child Relationship in mysql

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

--------------------------------------------------------
    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
// 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>");
    }
}

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

相反,我建议使用您正在使用的任何客户端组件来显示它(它是树吗?),它知道如何遍历平面列表并从中构建层次结构。

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

$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, '');

如果你想在你的网站上使用它,你可以很容易地调整它。代码应该是自解释的