如何将两个FK从一个表加入另一个表?

时间:2011-11-12 14:13:06

标签: mysql sql join normalization inner-join

我有一个多对多关系表:

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:如何在一个查询中加入三个表来检索连接和待处理请求。

3 个答案:

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

作为副作用,这也将使重婚变得不可能。 再次:实现约束的好的家庭作业。