Объединить два внешних ключа из одной таблицы в SQL
Не совсем уверен, как задать этот вопрос, поэтому, если кто-то хочет отредактировать, чтобы лучше сформулировать, пожалуйста. Однако я хочу присоединиться к пользовательской таблице, однако в строке есть два 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 ответа
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;
работал для любопытных, на что намекал Дрю в комментариях
схема
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 |
+----------+----------+-----------------------+
Всегда загружайте ограничения внешнего ключа для обеспечения ссылочной целостности. Признак хорошо спроектированной схемы - это не что иное, как случайность и мусор.
Страница руководства по ограничениям внешнего ключа.
Все, чего не хватает, так это рассмотрения ключей (индексов), добавленных в item_tbl для ownerId
а также lastModifiedById
столбцы, чтобы сделать соединения очень быстрыми и избежать сканирования таблицы