2016-09-17 70 views
2

唯一的朋友關係,我有我的友誼表如下分貝結構:取的雙向關係表

friends 
------- 
id | user_id | friend_id | action 
1  25   32  done 
2  32   25  done 
3  85   50  done 
4  50   85  not now 
5  18   52  done 

我有它使用上述結構來存儲友誼此維護項目。以下是病例:

  1. 25和32是朋友,因爲它們具有記錄(ID 1,2)和在動作柱上進行

  2. 用戶85發送請求至50(ID:3)但50不與操作接受「不現在」

  3. 用戶52沒有采取任何行動請求從用戶18


  • 現在我想從上面的結構中獲得所有獨特的完整關係(當兩個用戶都採取行動時)。所以,25和32之間的關係應該只顯示一次。
  • 所有未響應請求或採取措施not now的用戶。

由於這是一個維護項目,我不能真正改變結構,所以必須解決這個問題。

+1

你爲什麼寫*「誰沒有迴應請求或採取行動不是現在所有的用戶。」 *?你也想要他們嗎? – Bohemian

回答

0

您可以加入兩個子查詢,一個用於關係的每一邊。爲了確保你沒有得到重複的答案,你可以有一個子查詢手柄user_id比那friend_id規模較小的和其他處理的其他方式輪:

SELECT u.user_id, u.fried_id 
FROM (SELECT user_id, friend_id 
     FROM friendship 
     WHERE user_id < friend_id AND status = 'done') u 
JOIN (SELECT user_id, friend_id 
     FROM friendship 
     WHERE user_id > friend_id AND status = 'done') f ON 
     u.user_id = f.friend_id AND 
     u.friend_id = f.user_id 
0

要查找所有已完成的友誼,加入表本身匹配的反向關係:

select a.user_id, a.friend_id 
from friendships a 
join friendships b on b.user_id = a.friend_id 
    and b.friend_id = a.user_id 
    and b.action = 'done' 
where a.user_id < a.friend_id 
and a.action = 'done' 

where子句確保你只選擇只排在user_id是小於friend_id得到各一次關係。

0

試試這個關於第一個問題:

SELECT a.user_id, a.friend_id, a.action 
FROM friends a 
INNER JOIN friends b ON a.friend_id = b.user_id 
WHERE a.action = 'done' AND b.action = 'done' 
AND a.user_id < b.user_id 

--Second

SELECT a.user_id, a.friend_id, a.action 
FROM friends a 
LEFT JOIN friends b ON a.friend_id = b.user_id 
WHERE a.action = 'done' 
AND (b.action <> 'done' OR b.user_id IS NULL)