2016-02-25 49 views
0

我有一個名爲users表,看起來像這樣的例子:我如何獲得用戶之間的關係?

表:用戶

username id 
Simon  6 
Ida  7 

而一個關係表

Table: Relationships 

me partner 
6  7 

現在所創建的我的每一段關係並且合作伙伴列將根據哪個用戶發送請求獲取id。

如果伊達發送到西門的請求,列看起來是這樣的:我:7夥伴:6 因爲艾達是身份證號碼7和西蒙是6號。

但是,如果西蒙發送一個請求,然後列看起來像這樣:我:6夥伴:7

我想要做的是編寫一個查詢,將從關係表中爲每個有關係的用戶獲取正確的id,然後使用該id加入用戶表並獲取合作伙伴用戶名並打印出來。

我的問題是,我和合作夥伴的列可能具有不同的值,具體取決於2個用戶中的哪一個首先發送請求。

我該如何編寫一個查詢,爲每個用戶打印正確的信息併爲他們提供合作伙伴的正確ID?

輸出應該如何看待這樣的:

  • 但從* 西蒙斯一點:你是在艾達的關係。

  • 從Idas的角度來看* :你與西蒙有關係。

+0

也許像'發起人/發件人','往復/收件人'這樣的術語會更合適嗎? – Strawberry

+1

您能否提供一些樣品數據和預期產量?我認爲我知道你在做什麼,但不用猜測就會更容易,更快速。 http://stackoverflow.com/help/how-to-ask –

+0

新增和示例。 – Eymen

回答

0

我想提供一個替代方案。

將用戶表加入me列或partner列中的關係表。

然後使用相同的標準將用戶表重新添加到關係表中。

SELECT u.username, 
FROM users u 
JOIN relationships r ON u.id = r.me OR u.id = r.partner 
JOIN users u2 ON r.me = u2.id OR r.partner = u2.id 
WHERE u.id = 'THE USER YOU CARE ABOUT' 

未經測試。如果你拋出一些CREATE TABLE s和INSERT INTO s我們都可以玩。

0

如果你想獲得其中有一些用戶(例如:ID:2)之間的關係的所有用戶指定,我會用這樣的:

SELECT id, username 
FROM user, 
    (SELECT receiver_id as rel_id FROM relationship WHERE sender_id=2 union 
    SELECT sender_id as rel_id FROM relationship WHERE receiver_id=2) tab 
WHERE id=rel_id 

內聲明的手段您正在選擇所有的關係,其中2是發件人,以及2是接收者的所有關係,並將它們堆疊在同一列(聯合)中。

之後,表用戶用於從id獲取用戶名。

0
Select username as username, 
    (select username name from users uSubq where uSubq.id = r.partner) as partnername 
    from users u join relationships r on u.id=r.me 
UNION 
Select username as username, 
    (select username name from users uSubq where uSubq.id = r.me) as partnername 
    from users u join relationships r on u.id=r.partner; 

下面是查詢測試:Sql Fiddle

如果任一井田發送請求西門或反向而不是兩個,使用UNION ALL有更好的表現。