Mysql 获得员工经理的经理
我有一个employee表,其中包含一个经理ID作为列。如果我需要找某个员工的经理,我将如何有效地做到这一点?如果我们需要一个5层的深度呢Mysql 获得员工经理的经理,mysql,schema,query-optimization,Mysql,Schema,Query Optimization,我有一个employee表,其中包含一个经理ID作为列。如果我需要找某个员工的经理,我将如何有效地做到这一点?如果我们需要一个5层的深度呢 如果这是一项要求,我们可以更改数据库模式以提高效率吗?请阅读,了解如何通过自定义定义自己版本的Oracle的连接。当我做类似的事情时,我可能会让人在表中 员工 然后我会有一个带有列的表management manager\u id和employee\u id 两列都引用employee.id(因为经理也是员工,明白吗?) 这样,您就可以为每个员工创建一个指向
如果这是一项要求,我们可以更改数据库模式以提高效率吗?请阅读,了解如何通过自定义定义自己版本的Oracle的
连接。当我做类似的事情时,我可能会让人在表中
员工
然后我会有一个带有列的表management
manager\u id
和employee\u id
两列都引用employee.id(因为经理也是员工,明白吗?)
这样,您就可以为每个员工创建一个指向其经理的管理
条目,并对每个经理执行相同的操作,等等。。。它将深入到你需要的任何层次
编辑:真的,我假设您会有另一个表managerdata
,其中包含关于每个经理的附加数据,但我不会复制员工
中的数据-只需添加有关经理的额外详细信息,并包含一列指向员工.id
我能想到的唯一方法就是根据需要进行递归。一个简单的例子是:
///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
注意:未测试您是否可以动态创建查询以确定需要向上查询多少人?您当前的架构是什么样的,将经理与员工关联起来?员工是否只有一个经理,或者你支持矩阵员工吗?我不明白为什么会投反对票。假设我们有一个员工表,其中有一个经理ID作为列…..所以同一个表包含员工和他们的经理…..这也是一个面试官问我的问题一个好主意,我被指数增长吓跑了(添加一名员工,需要更新每个人与该员工/经理的链接);但如果他经常这样问会更快。我不明白你的逻辑。如果你添加一名员工,你只需将他们作为员工插入,然后为他们的经理和任何直接下属添加一行。例如,总裁将没有与看门人的链接,只与他正下方的人(副总裁等)链接.哦,我看错了你的帖子。听起来你会给公司里的每一个人排一行,解释他们相对于插入的员工的位置。而不仅仅是直接在上面和下面的员工。我知道这听起来是怎么回事,是的,这并不理想。我的数据库目标是允许存储尽可能少的数据可以说明整个情况。如果我想了解数据的复杂情况,那就是聪明的查询和智能脚本的用途。