获得员工经理的经理

时间:2011-04-22 02:00:46

标签: mysql schema query-optimization

我有一个员工表,其中包含一个经理ID作为列。如果我需要获得某个员工的经理经理,我该如何有效地做到这一点?如果我们需要5层深度怎么样?

如果这是一项要求,我们是否可以更改数据库架构,以便更有效地完成这项工作?

3 个答案:

答案 0 :(得分:1)

阅读this article,了解如何定义自己的Oracle connect by自定义版本。

答案 1 :(得分:0)

当我做这样的事情时,我可能只会让人在桌子上 employee

然后我会有一个包含列的managementmanager_idemployee_id

两个列都引用了employee.id(因为经理也是员工,得到它吗?)

这样你就可以为每个指向他的经理的员工创建一个management条目,并为每个经理做同样的事情......并且它会根据你的需要进行多深入的处理。< / p>

编辑:我真的假设你会有另一张表managerdata,其中包含有关每位经理的其他数据,但我不会复制employee中的数据 - 只需添加有关经理的额外详情,包含指向employee.id

的列

答案 2 :(得分:0)

我能想到的唯一方法就是根据需要尽量减少。一个简单的例子是:

///hight: how far up the manager chain to go
///startid: The id from which to start
function getManager ($startid, $hight)
{
    return getManagerRecurse ($hight, 0, $startid);
}
function getManagerRecurse ($hight, $curHight, $curid)
{
    if ($hight == $curHight)
        return $curid;
    $sql = "SELECT `managerid` FROM `table` WHERE `id`='$curid' LIMIT 1";
    $result = mysql_query($sql);
    if (mysql_num_rows($result) == 0)
        return -1; //Can't go up any further, so just return -1
    list($manid) = mysql_fetch_array($result);
    return getManagerRecurse ($hight, $curHight + 1, $manid);
}


getManager (15,2); //Start at id 15, go up 2 managers

注意:未经测试