2012-10-16 53 views
0

我正在創建一個小型社交網絡,其中當用戶發佈任何內容時,我將獲得他轉介給他的朋友的ID。現在問題是將被引用的用戶可以在1 or 10之間。所以現在假設一個用戶發佈了一個狀態並且引用了6個朋友。MYSQL爲多個用戶檢索共同朋友

現在我需要在發佈狀態的用戶和逐一介紹的人之間找到共同朋友。意味着假設發佈狀態的用戶的ID爲1,並且被引用的人有2,3,4,5,6,7

那麼查詢將做到這一點會發現1 and 2之間共同的朋友,然後1 and 3然後在最後我將越來越含誰張貼的用戶和人民之間的相互朋友的結果1 and 4並以此類推,直到7.So誰被引用(或標籤,我們可以說)。

我有兩個表UserFriends

User Table:        Friends Table: 
--------------------------     ----------------------------------- 
UserID Name       friendsid  friendname  userid 
--------------------------     ----------------------------------- 
1097517748   User1      3   friend1  536772587      
100003052455644 User2      8   friend2  100003052455644 
536772587   User3      8   friend3  1097517748 
4     User4      3   friend4  100003052455644 

現在的朋友表可以包含不同的人誰做,或在用戶不存在table.In這個例子用戶2和3具有與朋友ID 8共同的。我有我的傢伙,但那個人的身份證即8也必須在用戶表也存在。這僅在用戶ID 2和3之間。 我會得到幾個用戶ID,我找到所有的朋友與已發佈狀態的人員交談的朋友。

我希望我已經清除它。如果我得到了查詢的想法,我可以動態地使用php爲不同數量的推薦朋友生成它。

到目前爲止,我已經寫了這個查詢。

SELECT count(f1.friendsid) FROM friends AS f1 
INNER JOIN friends AS f2 ON f1.friendsid = f2.friendsid 
WHERE f1.userid = 100003052455644 
AND f2.userid = 1097517748 

但這只是給我帶來兩者之間共同的朋友user.When我添加第三個傢伙可以說f3並與f1比較它不會帶來任何結果,並且與此查詢的另一個問題是,它不驗證用戶表中是否存在共同的朋友id。添加第三個人之後。

SELECT count(f1.friendsid) FROM friends AS f1 
INNER JOIN friends AS f2 ON f1.friendsid = f2.friendsid 
INNER JOIN friends AS f3 ON f1.friendsid = f3.friendsid 
WHERE f1.userid = 100003052455644 
AND f2.userid = 1097517748 
AND f3.userid = 536772587 

此查詢不會帶來任何結果。所以我想創建一個查詢來完成所有這些。

編輯:

其實我使用Facebook Connect和我保存所有用戶的朋友在我的數據庫,當用戶登錄時,用戶表將只包含誰是註冊在我的網站的用戶。

+0

您的模式未規範化。 「朋友」也總是一個「用戶」,對吧?因此,有一個'user'表,其中包含user_id和user_name,並且具有帶user_id和friend_id的朋友表,這兩個表都是'users.user_id'的外鍵。它會讓你的查詢更容易。 – dnagirl

+0

檢查編輯。 – Mj1992

+0

在userid = 1的朋友表中沒有記錄,那麼您的第一個查詢如何返回任何結果?在哪裏f1.userid = 1不符合 –

回答

1

我終於明白了。查詢是

SELECT DISTINCT(friendsid) FROM (
SELECT DISTINCT(f1.friendsid) FROM friends AS f1 
INNER JOIN friends AS f2 ON f1.friendsid=f2.friendsid 
and f1.userid = 100003052455644 and f2.userid =1097517748 
INNER JOIN user ON f2.friendsid = user.userid and f1.friendsid = user.userid 
UNION ALL 
SELECT (f1.friendsid) FROM friends AS f1 
INNER JOIN friends AS f2 ON f1.friendsid=f2.friendsid 
and f1.userid = 100003052455644 and f2.userid =536772587 
INNER JOIN user ON f1.friendsid = user.userid and f2.friendsid = user.userid 
UNION ALL 
SELECT DISTINCT(f1.friendsid) FROM friends AS f1 
INNER JOIN friends AS f2 ON f1.friendsid=f2.friendsid 
and f1.userid = 100003052455644 and f2.userid =694250830 
INNER JOIN user ON f1.friendsid = user.userid and f2.friendsid = user.userid 
) a 

這個查詢就會發現誰貼的狀態和用戶的人,他所指向的用戶之間的所有共同的朋友的ID的。

ID爲100003052455644用戶是誰貼的地位的人,所有的人都是他的朋友被他referred.The DISTINCT將確保該ID的是唯一的,而不是repeated.This爲3口人,他referred.We能添加動態設置ID的UNION ALL部分,這將幫助我們創建一個動態查詢,以便爲不同數量的推薦人員檢索共同朋友。