我有一个多对多关系表:
表relationship
:
relationship_id,
first_user REFERENCES users(user_id),
second_user REFERENCES users(user_id),
表users
:
user_id,
other user information
要阅读给定用户的朋友(可以是first_user
或second_user
),我需要加入两个表(relationships
和users
),但是表relationships
的列是FK
问题1:如何加入两个表来同时使用两个FK?
我有一个待处理请求表,类似于表relationships
。批准请求后,该请求将从requests
中删除并插入relationships
。
问题2:如何在一个查询中加入三个表来检索连接和待处理请求。
答案 0 :(得分:2)
您必须提供“users”表别名的实例,因此您可以选择性地引用它们:
SELECT u1.*, u2.* FROM relationship r
JOIN users u1 ON (u1.user_id = r.first_user)
JOIN users u2 ON (u2.user_id = r.second_user)
要从请求和关系中选择,您可以使用UNION:
SELECT u1.*, u2.* FROM relationship r
JOIN users u1 ON (u1.user_id = r.first_user)
JOIN users u2 ON (u2.user_id = r.second_user)
UNION
SELECT u1.*, u2.* FROM requests r
JOIN users u1 ON (u1.user_id = r.first_user)
JOIN users u2 ON (u2.user_id = r.second_user)
答案 1 :(得分:1)
要使用这两个外键,您需要两个连接(每个连接一个):
select *
from relationship r
inner join users u1 on (u1.user_id = r.first_user)
inner join users u2 on (u2.user_id = r.second_user)
答案 2 :(得分:1)
{relationship_id,first_user,second_user}表包含重复组。
只需删除其中一个(使relationship_id非唯一)并添加代理键(或将userid添加到主键)。
CREATE TABLE relationships
( id INTEGER NOT NULL PRIMARY KEY
, relationship_id INTEGER NOT NULL
, user_id INTEGER NOT NULL REFERENCES users(user_id)
);
尝试为此构造生成约束将是一项不错的家庭作业。
另一种方式(对于像婚姻这样的二元关系)是将“重要的其他”链接放在用户表中:
CREATE TABLE lusers
( luser_id INTEGER NOT NULL PRIMARY KEY
, magnificent_other INTEGER REFERENCES lusers (luser_id)
...
);
作为副作用,这也将使重婚变得不可能。 再次:实现约束的好的家庭作业。