2016-08-23 122 views
1

我想構建一個查詢。要求是獲得兩個用戶之間的共同朋友的數量。這我需要做一個單一的userId作爲參數傳遞。但結果將是遞歸的。它會像一棵樹。下面的表結構將要給大家介紹的是要求一個想法:SQL Server計數的共同朋友

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 

以上是一個簡單的查詢給予以下的輸出:

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

正如你所看到的,1是不是朋友3還在列表中。查詢的期望的輸出是:

PersonID FriendID MutualFriend 
3   2   4 
3   4   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

好一個親愛的。收下。 – Developer

+0

這個查詢給了我錯誤的答案。只是改變插入插入值@Friendship SELECT 1,2 UNION SELECT 1,4 UNION 選擇2,1 UNION SELECT 2,3 UNION SELECT 3,2 UNION SELECT 3,4 UNION SELECT 4,1 UNION SELECT 4,2 UNION SELECT 4,3結果中斷。 1不是3&4的共同朋友,但它在列表中。 – User2682