我有一张员工表,其中包含列:employee_id、name、employee_manager_id。 employee_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/