2014-01-12 179 views
0

比方說,我有一張名爲「朋友」的表格,並且爲每個友誼添加了兩個條目。例如,如果用戶1和2是朋友,我們將有:找到朋友的朋友,排除朋友的最有效方法

uid1 uid2 
---------- 
1 2 
2 1 

我的目標是要找到朋友的朋友,exclding朋友。以下查詢給我朋友的朋友(包括朋友):

SELECT f2.uid2 FROM friends f1, friends f2 WHERE f1.uid1='YOUR_ID' AND f1.uid2=f2.uid1 AND f2.uid2!='YOUR_ID' 

我的首選是不使用IN或NOT IN。你能想出任何補充這個查詢的東西嗎?

+0

爲什麼你的朋友加入兩個記錄?這不會重複記錄嗎? –

+0

它使事情變得更容易。我不需要這樣的CASE語句。 – user3163577

+0

RDBS不適合圖形。對於這個特殊的要求是可以的,但你可以考慮切換到圖形DBS。 –

回答

0

添加你自己的朋友外連接,所以你可以把它們過濾掉。

SELECT f2.uid2 FROM friends f1 
JOIN friends f2 ON f1.uid2 = f2.uid1 
LEFT JOIN friends f3 ON f3.uid2 = f2.uid2 AND f3.uid1 = 'YourID' 
WHERE f1.uid1='YourID' 
AND f2.uid2!='YourID' 
AND f3.uid2 IS NULL 

SQLFIDDLE

0

你可以用一個額外的join和聚集做到這一點:

SELECT f2.uid2 
FROM friends f1 join 
    friends f2 
    on f1.uid1 = 'YOUR_ID' AND f1.uid2 = f2.uid1 AND f2.uid2 <> 'YOUR_ID'` join 
    friends f3 
    on f2.uid2 = f3.fuid1 
GROUP BY f2.uid2 
HAVING sum(f3.uid2 = 'YOUR_ID') = 0; 
+0

如果您正在使用準備語句(您應該),那麼您不能在連接子句中使用'your_id'條件。 –