2017-09-18 85 views
1
下令

我下面的表格已經建議的朋友們共同的朋友在MySQL

友誼

id | friend_one | friend_two | status | date 
1 | 1   | 2   | 2  | 10/06/2016 
3 | 2   | 3   | 2  | 10/06/2016 
4 | 2   | 4   | 2  | 10/06/2016 
5 | 2   | 5   | 2  | 10/06/2016 
6 | 4   | 5   | 2  | 10/06/2016 
7 | 3   | 4   | 2  | 10/06/2016 
8 | 3   | 7   | 2  | 10/06/2016 
9 | 5   | 1   | 2  | 10/06/2016 
10 | 6   | 4   | 2  | 10/06/2016 
11 | 6   | 1   | 2  | 10/06/2016 

friendship表,status = 2意味着他們是朋友和friend_one是用戶是發送好友請求。

我想根據共同朋友的人數得到朋友的建議,也就是說,朋友的共同點越多,被推薦給我(用戶登錄)的機會就越大。

對於這一點,我認爲以下幾點:

  1. 選擇我所有的朋友,然後
  2. 選擇我的朋友所有的朋友(刪除我自己),然後
  3. 檢查我的朋友的朋友們不是我的朋友,那麼
  4. 推薦給朋友(通過共同的朋友爲了計數)

但是,我不能把它付諸實踐。爲了實現第一個步驟,我開始用(考慮到用戶登錄的id 1):

SELECT 
CASE WHEN a.friend_one = 1 THEN a.friend_two ELSE a.friend_one END AS myFriend 
FROM friendship a 
WHERE 1 IN(a.friend_one, a.friend_two) AND a.status = 2 

所以,我可以用ID選擇用戶的所有好友1

要實現了第二步,我所做的:

SELECT 
CASE WHEN a.friend_one = 1 THEN a.friend_two ELSE a.friend_one END AS myFriend, 
CASE WHEN b.friend_one = myFriend THEN b.friend_two ELSE b.friend_one END AS friendFriend 
FROM friendship a 
LEFT JOIN friendship b ON myFriend IN (b.friend_one, b.friend_two) AND b.status = 2 
WHERE 1 IN(a.friend_one, a.friend_two) AND a.status = 2 

所以,我得到的錯誤:

Error Code: 1054. Unknown column 'myFriend' in 'field list'

但是,我不知道如何繼續。我認爲的四個步驟是正確的?如果是這樣,我如何根據共同朋友的數量「修復」錯誤並獲得朋友建議?

期望的結果: 4(3周共同的朋友),3(1周共同的朋友)

+0

根據你的闡述,建議的朋友是'5,3,4'?或者你可以發佈你想要的結果嗎? – Blank

+0

@Forward我編輯了表格,以便更容易地呈現所需的結果並在問題中添加了所需的結果。 – Igor

回答

1

你建立了myFriend別名作爲你的第二個步驟中的SELECT子句的第一列;您不能將該別名用作同一SELECT子句中其他列的源。您將不得不重複CASE語句。或者,您可以在子查詢中計算myFriend,並在某些地方按名稱引用它。

這只是對您收到的錯誤消息的迴應,而不是對您的完整算法的檢查。