不太确定如何提出这个问题所以如果有人想编辑以更好地表达请。但是我想加入用户表,但该行有两个来自用户表的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"
目前我正在进行两次查询以获取此信息。是否有更好的(读取:更有效)方式?
答案 0 :(得分:9)
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在评论中暗示的那些好奇工作
答案 1 :(得分:3)
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的键(索引),以使连接更快并避免表扫描