2017-03-07 220 views
0

我有兩個表,用戶連接,他們有這些列關係:PostgreSQL的:朋友的朋友,但我的那些朋友們

CREATE TABLE users (
    id serial PRIMARY KEY, 
    name text 
); 

CREATE TABLE connections (
    from_id int REFERENCES users (id) ON DELETE CASCADE, 
    to_id int REFERENCES users (id) ON DELETE CASCADE, 
    status connection_status, 
    PRIMARY KEY (from_id, to_id), 
    UNIQUE (from_id, to_id) 
); 

而且我也有這種類型:

CREATE TYPE connections_status AS ENUM ('accepted', 'pending'); 

連接表將爲每個連接包含一行,所以如果user1與user2有連接,它將是一行,但這並不意味着user2與user1有連接。看到它像Instagram或Twitter,在那裏你有追隨者,你跟隨的人。因此,如果數據庫中有一行user1爲from_id,並且user2爲to_id這意味着user1跟隨user2。

問題

我想獲得一個用戶的連接,並在一個查詢我到他的連接關係。例如,假設我是user1,我想查找user2的所有連接(接受和未決的追隨者和followees),以及我的連接與user2的連接(可以接受,掛起或空)。

回答

0

見附件查詢,我加入了連接兩次與用戶 1 users.id與connection.from_id,這個連接會帶來所有的user1的狀態如下 2. users.id與connection.to_id以下的用戶,這個連接將使所有跟在user1後面的用戶處於狀態。

非常無能:如果user1擁有多於一個連接,您將爲每個組合恢復行。

,如果你想獲得一個行中您可以使用Windows函數的每個用戶,超前和滯後

select user.id as user, 
     user.name, 
     following.from_id as user_following, 
     following.status as status_following, 
     followees.from_id as user_followees, 
     followees.status as status_followees 
from users 
left join connections following on users.id=following .from_id 
left join connections followees on users.id=followees.from_id