2016-08-23 10 views
1

クエリを作成しようとしています。要件は、2人のユーザー間で相互の友人の数を取得することです。これは、パラメータとして渡された単一のユーザーIDに対して行う必要があります。ただし、結果は再帰的になります。それは木のようになります。次の表の構造は、あなたの要求であるかについての考えを与える:1は友人ではない、あなたが見ることができるように相互の友人のSQLサーバーの数

PersonID FriendID MutualFriend 
3   2   1 
3   2   4 
3   4   1 
3   4   2 

DECLARE @Person TABLE 
(ID INT PRIMARY KEY, 
Name VARCHAR(25)) 

DECLARE @Friendship TABLE 
(PersonID INT, 
FriendID INT) 

--Person table entry 
INSERT @Person 
SELECT 1, 'A' UNION ALL 
SELECT 2, 'B' UNION ALL 
SELECT 3, 'C' UNION ALL 
SELECT 4, 'D' 

--Person:Friend relationship entry 
INSERT @Friendship 
SELECT 1, 2 UNION 
SELECT 1, 4 UNION 
SELECT 2, 1 UNION 
SELECT 2, 3 UNION 
SELECT 2, 4 UNION 
SELECT 3, 2 UNION 
SELECT 3, 4 UNION 
SELECT 4, 1 UNION 
SELECT 4, 2 UNION 
SELECT 4, 3 

SELECT DISTINCT F1.*, F2.PersonID AS MutualFriend 
FROM @Friendship AS F1 
INNER JOIN @Friendship AS F2 ON F2.PersonID <> F1.PersonID AND F2.FriendID = F1.FriendID 
INNER JOIN @Person AS P1 ON P1.ID = F1.PersonID 
INNER JOIN @Person AS P2 ON P2.ID = F2.FriendID 
JOIN @Person AS P3 ON P3.ID = F2.FriendID 
WHERE F1.PersonID = 3--The person for which friends and mutual friends need to be found 
ORDER BY F1.PersonID 

上記の次の出力を与えるサンプルクエリですまだ3のリストにあります。クエリの望ましい出力は次のとおりです。

PersonID FriendID MutualFriend 
3   2   4 
3   4   2 

誰かがこのクエリで私を助けることができますか?私は、2人の間にお互いの友人の数が好きであることをお勧めします。

答えて

1

所望の出力によると、このために、あなたの選択の交換を試してみてください。

SELECT F1.*, MAX(F2.PersonID) AS MutualFriend 
FROM @Friendship AS F1 
INNER JOIN @Friendship AS F2 ON F2.PersonID <> F1.PersonID AND F2.FriendID = F1.FriendID 
INNER JOIN @Person AS P1 ON P1.ID = F1.PersonID 
INNER JOIN @Person AS P2 ON P2.ID = F2.FriendID 
JOIN @Person AS P3 ON P3.ID = F2.FriendID 
WHERE F1.PersonID = 3 
group by F1.personID,F1.FriendID 
+0

良い1人の愛します。それを保つ。 – Developer

+0

このクエリは私に間違った答えを与えています。ただ、4を選択 3,4 UNIONを選択 UNION 3、2 UNIONを選択 3、2を選択 UNION 2、1 UNIONを選択 4、UNIONは、1を選択 2、@Friendship 1を選択 インサートに挿入値を変更する1 UNION SELECT 4、2 UNION SELECT 4、3および結果が壊れています。 1は3&4の友人ではありませんが、まだリストにあります。 – User2682

関連する問題