在 SQL 中加入来自同一个表的两个外键

Posted

技术标签:

【中文标题】在 SQL 中加入来自同一个表的两个外键【英文标题】:join on two foreign keys from same table in SQL 【发布时间】:2015-12-13 20:18:13 【问题描述】:

不太清楚如何问这个问题,所以如果有人想编辑以更好地表达,请。但是我想加入一个用户表但是该行有两个来自用户表的 FK

item_tbl
id | ownerId | lastModifiedById | itemName
------------------------------------------
1  |       1 |                2 | "Blog Post"

user_tbl
id | username
-------------
1  |     John
2  |    Sally

期望的输出(或类似的东西)

Owner Username | last modified by |       item
----------------------------------------------
          John |            Sally | "Blog Post"

目前我正在执行两个查询来获取此信息。有没有更好(阅读:更有效)的方法?

【问题讨论】:

当然,FK 很好,但在选择的 stmt 上,它们完全无关紧要。如果我没看错的话。我想您要问的是,这是我的数据,我如何获得所需的输出 你是对的,我试图说 ownerId 和 lastModifiedById 与 user_tbl.id 相关 很公平。并且 kuddo 这样做。您想要的是使用 two 别名对 user_tbl 进行双重连接。我打赌你能做到。首先尝试获取所有者名称。然后,您对同一张表(使用不同的别名)进行另一次联接以获取第 2 列 Duhhhhhhhhhhhh 谢谢。漫长的工作日哈哈。 【参考方案1】:
SELECT user_tbl.username Owner, a.username Modifier, item_tbl.itemName 
FROM item_tbl 
JOIN user_tbl 
ON item_tbl.ownerId = user_tbl.id 
JOIN user_tbl a 
ON item_tbl.lastModifiedById = a.id;

为那些好奇的人工作,正如 Drew 在 cmets 中暗示的那样

【讨论】:

干得好 jbh,没那么难 我认为你在最后有点错误 ahhh yesss... 处理人为数据时令人敬畏的失败副本。非常感谢您的帮助。【参考方案2】:

架构

create table user_tbl
(   id int auto_increment primary key,
    username varchar(50) not null
);

create table item_tbl
(   id int auto_increment primary key,
    ownerId int not null,
    lastModifiedById int not null,
    itemName varchar(50) not null,
    CONSTRAINT fk_own_user FOREIGN KEY (ownerId) REFERENCES user_tbl(id),
    CONSTRAINT fk_mod_user FOREIGN KEY (lastModifiedById) REFERENCES user_tbl(id)
);
insert user_tbl(username) values('John');   -- this becomes id 1
insert user_tbl(username) values('Sally');  -- this becomes id 2

FK 故障快速测试:

insert item_tbl(ownerId,lastModifiedById,itemName) values (9,9,'blah');

错误代码:1452。无法添加或更新子行:外键 约束失败

按预期失败,这是一件好事,因为数据不好

成功:

insert item_tbl(ownerId,lastModifiedById,itemName) values (1,2,'the Blog Post is this');

查询

select u1.username,u2.username,i.itemName 
from item_tbl i 
join user_tbl u1 
on u1.id=i.ownerId 
join user_tbl u2 
on u2.id=i.lastModifiedById;
+----------+----------+-----------------------+
| username | username | itemName              |
+----------+----------+-----------------------+
| John     | Sally    | the Blog Post is this |
+----------+----------+-----------------------+

始终加载外键约束以强制执行参照完整性。设计良好的架构的标志是没有任何机会和垃圾被放入。

Foreign Key Constraints 上的手册页。

所有缺少的只是考虑为 ownerIdlastModifiedById 列添加到 item_tbl 的键(索引),以使连接速度更快并避免表扫描

【讨论】:

以上是关于在 SQL 中加入来自同一个表的两个外键的主要内容,如果未能解决你的问题,请参考以下文章

3.啥是键、候选键、主键和外键?

sql中啥叫主键表,啥叫外键表

请问SQL server 中的主键和外键的作用

数据库开发基础-SQl Server 主键外键子查询(嵌套查询)

如何在Django中加入非主键和外键列的查询

mysql表中,表的外键关联自身主键,为啥插入不了数据?