在SQL中连接来自同一个表的两个外键

时间:2015-09-17 03:44:51

标签: mysql sql mariadb

不太确定如何提出这个问题所以如果有人想编辑以更好地表达请。但是我想加入用户表,但该行有两个来自用户表的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"

目前我正在进行两次查询以获取此信息。是否有更好的(读取:更有效)方式?

2 个答案:

答案 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上的手册页。

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