2012-12-24 123 views
1

我正在嘗試開發一個功能,向朋友展示我的朋友,以及我與這些用戶有多少共同朋友。到目前爲止,我已經能夠獨立完成這些功能,但不能在一起。共同的朋友 - MySQL

這裏是我使用的主視圖叫做userfriends。其中user1是第一個用戶,user2是朋友。

enter image description here

這是我所研製看到

SELECT id FROM users 
WHERE id IN (
    SELECT user2 FROM userfriends WHERE user1 = me 
) AND id IN (
    SELECT user2 FROM userfriends WHERE user1 = second 
) 

用戶兩個用戶之間共同的朋友的功能是它可以在userfriends表中找到的用戶ID鏈接到有關的一個主表用戶。我和第二個是模擬搜索第一個和第二個用戶的存儲過程中的變量。此功能用於計劃。

我的第二個功能是看到所有與我的朋友是朋友的用戶,但不與我在一起。

SELECT user2 AS id 
FROM userfriends 
    WHERE user1 IN (
     #Selects my friends 
     SELECT user2 FROM userfriends 
     WHERE user1 = me 
    ) 
    AND user2 <> me #Makes sure is not me 
    AND user2 NOT IN (#Makes sure not already friend 
     SELECT user2 FROM userfriends 
     WHERE user1 = me 
    ) 

再一次,所有正在計劃和我的工作代表用戶ID。這將返回我所有朋友朋友的列表。

我希望能夠得到共同的用戶列表,或者我的朋友的朋友列表,而不是什麼是:

其中有我的朋友的朋友的用戶ID和多少個共同的朋友我和一個表用戶份額。等:用戶:1,friends_in_common:103.如果我不夠清楚,請問,我會盡量讓它更清楚。這兩個函數自己做,但我不知道如何將它合併在一起。

回答

1
-- use a self-join of userfriend*userfriend 
-- to find all the friends that moi&toi have in common 
-- , and count them. 
-- (optionally) suppress the rows for (toi<=moi) 
-- , because there are basically the same as the corresponding rows with 
-- (toi>moi) 
-- ----------------------------------- 
SELECT DISTINCT 
    uf1.user1 AS moi 
    , uf2.user1 AS toi 
    , COUNT(*) AS cnt 
    FROM userfriend uf1 
    JOIN userfriend uf2 ON uf1.user2 = uf2.user2 
    WHERE uf1.user1 < uf2.user1 -- Tie breaker, symmetry remover 
    GROUP BY uf1.user1, uf2.user1 
    ; 
+0

嘿,這似乎在做什麼?但你能解釋一下嗎?因爲我不是100%確定它是正確的 – MichaelH

+0

你走了。 (對我來說,SQL比我的文本解釋更具可讀性;-) – wildplasser

+0

太棒了!似乎是完美的工作。 – MichaelH