2011-11-12 76 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) 
... 
); 

作爲一個副作用,這也將使重婚是不可能的。 再次:很好的作業分配來實現約束。

相關問題