在 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 实例添加别名来完成的。
在这种情况下,角色是“输入者”和“评论者”,因此查询可以分别使用别名 e
和 r
。查询可以采用以下形式:
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
我正在使用 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 实例添加别名来完成的。
在这种情况下,角色是“输入者”和“评论者”,因此查询可以分别使用别名 e
和 r
。查询可以采用以下形式:
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