2011-11-12 43 views
0

我有尽可能多的一对多关系的表:如何将两个FK从一个表连接到另一个表?

relationship

relationship_id, 
first_user REFERENCES users(user_id), 
second_user REFERENCES users(user_id), 

users

user_id, 
other user information 

阅读给定用户的朋友(可在first_usersecond_user),我需要加入两个表(relationshipsusers),但表relationships的两列是FK

问题1:如何连接两个表以使用两个FK?

我有一个类似于表relationships的未决请求表。在批准请求后,它将从requests中删除并插入到relationships中。

问题2:如何在一个查询中连接三个表以检索连接和挂起的请求。

回答

2

你必须给表的别名“用户”的情况下,所以你可以参考他们serparately:

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

同时使用外键,你需要两个连接(每个):

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) 
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) 
... 
); 

作为一个副作用,这也将使重婚是不可能的。 再次:很好的作业分配来实现约束。

相关问题