PHP MySQL层次结构数据优化

标签 php mysql optimization hierarchical-data

我有一张员工表,其中包含列:employee_idnameemployee_manager_idemployee_manager_id 引用 employee_id。这是一个分层数据。

我使用 PHP 获得了此输出,但仅使用一个 mySQL 查询无法实现。截至目前,我需要使用递归函数在 PHP 中处理数据,以便实现这种输出。

Sample Array Output 
0 => (
                employee_id => 2,
                name => Jerald,
                employee_manager_id => 1,
                depth => 1
            ),
        1 => (
                employee_id => 3,
                name => Mark,
                employee_manager_id => 2,
                depth => 2
            ), 
        2 => (
                employee_id => 6,
                name => Cyrus,
                employee_manager_id => 3,
                depth => 3
            ), 
        3 => (
                employee_id => 4,
                name => Gerby,
                employee_manager_id => 2,
                depth => 2
            )

到目前为止,这是我在 PHP 中实现上述输出的递归函数。

function get_employees_by_hierarchy( $_employee_id = 0, $_depth = 0, $_org_array = array() ) {
    if ( $this->org_depth < $_depth ) {
        $this->org_depth = $_depth;
    }

    $_depth++;
    $_query = "SELECT * FROM employees WHERE ";

    if ( !$_employee_id ) {
        $_query .= "employee_manager_id IS NULL OR employee_manager_id = 0";
    }
    else { 
        $_query .= "employee_manager_id = " . $this->dbh->quoteSmart( $_employee_id );
    }
    $_result = $this->query( $_query );

    while ( $_row = $_result->fetchRow() ) {
        $_row['depth'] = $_depth;
        array_push( $_org_array, $_row );
        $_org_array = $this->get_employees_by_hierarchy(
            $_row['employee_id'],
            $_depth,
            $_org_array
        );
    }
    return $_org_array;
}

我的问题是,无论如何我可以只使用一个 mysql 查询来实现我想要的数组输出? 如果在 mysql 查询中不可能,我当前的代码是否还有优化?

如有任何帮助,我们将不胜感激。

谢谢

最佳答案

您可以尝试嵌套集 a.k.a. celko 树,但插入和删除非常昂贵。还有闭包和路径枚举(物化路径),但我不是专家。 MySql 不支持递归查询。

关于PHP MySQL层次结构数据优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26679440/

相关文章:

php - 学生项目的模拟付款

php - 使用 MySQL 查询将数据导入 Wordpress-Magic 字段

php - 编辑 php mysql 中帖子的类别

string - 对字符串数组进行排序,以便任何其他字符串的子字符串稍后出现

c++ - 为什么对于这个涉及求幂的简单函数,clang 生成的代码比 gcc 快得多?

java - 如何将这个逻辑放入代码/数学中?

php - 仅从 codeigniter 中的列中选择唯一值

php - 如何在 Laravel 中自定义错误消息?

Python 通过 USB 串行发送许多短信

mysql - MySql 数据库中记事本文件的数据类型