【问题标题】:Getting manager of manager of an employee获取员工经理的经理
【发布时间】:2011-04-22 10:18:08
【问题描述】:

我有一个包含经理 ID 作为列的员工表。如果我需要获取某个员工的经理的经理,我将如何有效地做到这一点?如果我们需要 5 层深度呢?

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

【问题讨论】:

  • 您能否动态创建查询以确定您需要增加多少?
  • 您当前的架构是什么样的,将经理与员工相关联?
  • 员工只有一个经理,还是支持矩阵式员工?
  • 我很困惑为什么这会被否决。
  • 说我们有一个员工表,其中有一个经理 ID 作为列.....所以同一个表包含员工和他们的经理.....这也是我被问到的一个问题面试官

标签: mysql schema query-optimization


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    然后我会有一个带有列的表 management manager_idemployee_id

    两列都引用了employee.id(因为经理也是员工,明白吗?)

    这样您就可以为每个指向其经理的员工创建一个management 条目,并为每个经理做同样的事情,等等......它会根据您的需要深入到尽可能多的层次。

    编辑:真的我会假设你会有另一个表 managerdata 包含有关每个经理的附加数据,但我不会复制 employee 中的数据 - 只需添加有关经理的额外详细信息并包含一个列指向给employee.id

    【讨论】:

    • 一个好主意,我被指数级增长吓跑了(添加一名员工,需要更新每个人与该员工/经理的链接);但是如果他经常做这个查询会更快。
    • 我不遵循你的逻辑。如果您添加一名员工,您只需将他们作为员工插入,然后为他们的经理和直接在他们下面的任何人添加一行。例如,总统不会有与看门人的链接,只有他直接下属的人(副总裁等)。
    • 哦,我看错了你的帖子。听起来你会为公司中的每一个人排成一行,解释他们相对于插入的员工的位置。而不仅仅是直接上下的员工。
    • 我知道它听起来如何,是的,这并不理想。我对数据库的目标是允许存储尽可能少的数据来讲述整个故事。如果我想查看有关数据的复杂信息,那就是智能查询和智能脚本。
    【解决方案3】:

    我能想到的唯一方法就是根据需要递归。一个简单的例子是:

    ///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
    

    注意:未测试

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多