【发布时间】:2022-07-16 01:40:41
【问题描述】:
我正在 64 位 Windows 上使用 MySQL 后端(版本 5.7.19)和 LibreOffice Base 前端(版本 7.0.6.2 x64)。我有一张表格,列出了具有主键 ID 的人员。我还有一个工作订单表,其中有一个“输入者”字段和一个“审核者”字段,这两个字段都需要存储完成这些任务的人员的 ID。如果我想在一个表中有两个外键指向同一个表的主键,我的 SELECT 语句应该是什么样子?
在我的例子中,我有一个表“personnel”,其中包含两个字段,ID 作为主键,因此:
| ID | Name |
|---|---|
| 1 | John Smith |
| 2 | John Adams |
| 3 | Samuel Adams |
可以这样创建和填充:
CREATE TABLE orders(
workorder int(10) unsigned NOT NULL AUTO_INCREMENT,
entered_by int(10) unsigned NOT NULL,
reviewed_by int(10) unsigned NOT NULL,
PRIMARY KEY (workorder),
FOREIGN KEY (entered_by) REFERENCES personnel(id),
FOREIGN KEY (reviewed_by) REFERENCES personnel(id)
);
ALTER TABLE orders AUTO_INCREMENT = 1;
INSERT INTO personnel(name) VALUES('John Smith');
INSERT INTO personnel(name) VALUES('John Adams');
INSERT INTO personnel(name) VALUES('Samuel Adams');
另外,一个表 'orders' 包含三个字段,其中 enter_by 和 review_by 作为 person.id 的外键
| workorder | entered_by | reviewed_by |
|---|---|---|
| 1 | 2 | 3 |
| 2 | 3 | 1 |
可以这样创建和填充:
CREATE TABLE orders(
workorder int(10) unsigned NOT NULL AUTO_INCREMENT,
entered_by int(10) unsigned NOT NULL,
reviewed_by int(10) unsigned NOT NULL,
PRIMARY KEY (workorder),
FOREIGN KEY (entered_by) REFERENCES personnel(id),
FOREIGN KEY (reviewed_by) REFERENCES personnel(id)
);
INSERT INTO orders(entered_by, reviewed_by) VALUES (2,3);
INSERT INTO orders(entered_by, reviewed_by) VALUES (3,1);
我知道怎么做
SELECT workorder, personnel.name AS entered FROM orders JOIN personnel ON personnel.id = orders.entered_by ORDER BY orders.workorder;
导致 |工单|进入 | |-----------|---------| | 1 |约翰亚当斯 | | 2 |塞缪尔·亚当斯 |
怎么做
SELECT workorder, personnel.name AS entered FROM orders JOIN personnel ON personnel.id = orders.entered_by ORDER BY orders.workorder;
产生:
| workorder | reviewed |
|---|---|
| 1 | Samuel Adams |
| 2 | John Smith |
但我不确定如何将它们放入单个查询中,以便我得到:
| workorder | entered | reviewed |
|---|---|---|
| 1 | John Adams | Samuel Adams |
| 2 | Samuel Adams | John Smith |
【问题讨论】:
-
可以在一个表中有两个外键指向同一个表的主键吗? 可以。这种情况很常见(sender-receiver、homeplayer-guest 等)
-
请在代码问题中给出minimal reproducible example--剪切&粘贴&可运行代码&示例输入;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。对于 SQL 包括 DDL 和表格初始化代码。对于包含最少代码的调试,您可以提供的代码是您显示的代码可以通过您显示的代码扩展为不正常。 How to Ask Help center 当你得到一个出乎意料的结果时,暂停你的总体目标,切到第一个子表达式,结果出乎意料,然后说出你的预期和原因,并通过文档证明是合理的。 (调试基础。)
-
您的帖子属于评论的内容。但不是多余的,比如要求重新开放。 help center 您可以通过Meta Stack Overflow 和Meta Stack Exchange 的问答进行研究和提问(如果已研究和针对主题)重新提问和您的帖子——但要注意“元效应”。我的最后一条评论给出了minimal reproducible example 的摘要,但你没有做很多部分,比如第一个。 PS 问 1 个具体研究过的非重复问题。你的是啥呢?目前尚不清楚问号句子要求什么(SELECTing 不使用 FK),它不是帖子标题问题或隐含问题“如何将它们放入单个查询”。加入一个表两次是一个常见问题。
-
表(基础、视图和查询结果)表示关系(船舶)/关联。 FK 约束通常被称为“关系(船)”,但它们不是。他们说子行作为 PK/UNIQUE 出现在其他地方。表含义是查询的必要和充分条件。查询时不需要约束——包括 CK、PK 和 FK。它们是表关系(船)/关联选择的结果以及可能出现的情况/状态。它们是为了由 DBMS 强制执行完整性。 (但是当约束成立时,其他查询返回的结果与不假定约束的查询相同。)
标签: mysql join foreign-keys