在 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 上的手册页。
所有缺少的只是考虑为 ownerId
和 lastModifiedById
列添加到 item_tbl 的键(索引),以使连接速度更快并避免表扫描
【讨论】:
以上是关于在 SQL 中加入来自同一个表的两个外键的主要内容,如果未能解决你的问题,请参考以下文章