在 MySQL 中,如何将一个 table 中的两个字段连接到同一个 table 的主键?

In MySQL, how do I join two fields in one table to the same table's primary key?

我正在使用 MySQL 后端(版本 5.7.19)和 64 位 Windows 上的 LibreOffice Base 前端(版本 7.0.6.2 x64)。我有一个 table,其中列出了具有主键 ID 的人员。我还有一个工单 table,它有一个“输入者”字段和一个“审查者”字段,这两个字段都需要存储完成这些任务的人员的 ID。如果我想让一个 table 中的两个外键指向同一个 table 的主键,我的 SELECT 语句需要是什么样子?

在我的例子中,我有一个 table 'personnel',其中有两个以 ID 作为主键的字段,因此:

ID Name
1 John Smith
2 John Adams
3 Samuel Adams

此外,一个 table 'orders' 具有三个字段 entered_by 和 reviewed_by 作为 personnel.id

的外键
workorder entered_by reviewed_by
1 2 3
2 3 1

我知道怎么做

SELECT WORKORDER, PERSONNEL.NAME AS ENTERED FROM ORDERS JOIN PERSONNEL ON PERSONNEL.ID = ORDERS.ENTERED_BY ORDER BY WORKORDER.ID;

以及如何

SELECT WORKORDER, PERSONNEL.NAME AS REVIEWED FROM ORDERS JOIN PERSONNEL ON PERSONNEL.ID = ORDERS.REVIEWED_BY ORDER BY WORKORDER.ID;

但我不确定如何将它们放入单个查询中,因此我得到:

workorder entered reviewed
1 John Adams Samuel Adams
2 Samuel Adams John Smith

是的,根据关系代数,每对 table 之间可以有多个关系。

例如,这种情况的典型说明是 money_transfer table,记录资金从一个账户流向另一个账户。在这种情况下,table 将有两个针对 account table 的外键:一个表示钱的来源,另一个表示钱的去向。

其他 table 对之间可以有更多的关系。我见过用于授权目的和审计的案例,有很多 FK。

比如需求说APP需要记录谁输入了数据,谁验证了数据,谁接受了数据,谁执行了交易;有时它甚至有“first-level 批准”(金额超过 1 万美元)和“second-level 批准”(金额超过 10 万美元)。

编辑 - 加入相同的 Table 多次

根据要求,当多次加入相同的 table 时,您需要为 table 的每个“实例”分配不同的名称。通常,这是通过根据其角色向每个 table 实例添加别名来完成的。

在这种情况下,角色是“输入者”和“评论者”,因此查询可以分别使用别名 er。查询可以采用以下形式:

select o.*, e.name, r.name
from workorders o
join personnel e on e.id = o.entered_by
join personnel r on r.id = o.reviewed_by