【问题标题】:How do I write this recursive MySQL procedure?如何编写这个递归 MySQL 程序?
【发布时间】:2011-10-23 19:01:52
【问题描述】:

我有一个 MySQL 数据库,其中包含 2 个(相关)表:Staff、Supervisors。

员工包含:员工 ID、姓名、成本中心

Supervisors 包含:InstanceID、StaffID、SupervisorID、Obsolete

Staff 表包含公司中的所有员工,Supervisors 表将一个 StaffID (StaffID) 链接到另一个 StaffID (SupervisorID)。如果我们创建一个新的关系(即员工 A 不再向员工 B 报告,而是向员工 C 报告),那么我们创建一个新记录并将原来的 'obsolete' 标志设置为 'true'。

我之所以这样安排是因为主管:下属关系可能会发生变化,并且不能保证正确:我们希望能够更改它们并保持审计跟踪。

我需要做的是获取 CostCentres 的递归列表。

这意味着,假设我从某个成本中心开始。我得到了该成本中心所有员工的名单,并生成了他们所有下属的名单。然后我得到所有这些成本中心的列表,并为每个成本中心重复。

我已经有一些程序,其中两个可能是相关的:

CALL getCostCentre(iCostCentre) /* get a list of all staff in iCostCentre) */
CALL getSupervisees(iSupervisor) /* get a list of all staff who report to iSupervisor */

【问题讨论】:

    标签: mysql sql stored-procedures recursion


    【解决方案1】:

    我将创建一个包含员工和主管的表,我们称之为员工,以及另一个用于保存关系的表(每个表都有一个删除标志字段和一个用于审计试验的更改日期字段)。表关系有从属和主控。还有一个成本中心表,其中包含对员工的引用。周围有一些开源 CRM,您可以下载(也许使用它)并最终学习如何构建您的数据库。关于成本中心,可以参考标准CRM中的表Group

    【讨论】:

    • 这不正是我描述我的数据库的方式吗?我有一个包含所有员工的员工表和一个主管表,该表将一个或多个员工连接到作为其经理的另一位员工。我对 CRM 不感兴趣:我的应用程序非常具体。
    • 好吧,实际上只有一个区别,尽管很重要:它是为员工提供一张桌子而不是两张桌子。无论如何,我仍然无法理解您为什么要谈论递归过程。让我们以主管 A 为例,他有下属 B 和 D,每个人都有自己的成本中心。 B和D有可能是其他下属的主管吗?如果是,则需要递归过程,如果不是,则不需要。
    • 不,我觉得你很困惑。您说“我将创建一个包含员工和主管的表,我们称之为 Employee,以及另一个用于保存关系的表”。这就是我所做的完全。回答你的问题:当然B和D也是主管:只有当你到达树的最底层时,你才会发现没有下属的员工。我很确定我的问题是一个递归问题。
    • 好的,我明白了。对不起我的困惑。你看过这个例子吗? stackoverflow.com/questions/3438111/…
    猜你喜欢
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 2017-08-19
    • 2022-08-17
    相关资源
    最近更新 更多