簡體   English   中英

根據共同好友推薦好友

[英]Suggest friends based off of mutual friends

我已經在這個網站上環顧四周,但似乎沒有一個正是我正在尋找的。 他們中的很多人都在談論 Facebook 如何做到這一點,或者 Twitter 如何做到這一點來推薦關注者,但即便如此,他們也沒有給出任何直接的答案。
我發現的所有這些都只是使用兩個用戶 ID 計算共同的朋友。

我希望能夠獲取登錄用戶的ID,通過他們的朋友,並通過他們的朋友來計算與登錄用戶擁有最多共同朋友的人,建議人們添加擁有最多共同朋友的人.

為此,我正在使用 PHP 和 MySQL。 我似乎無法理解我將如何做。

我的友誼表看起來像這樣:

---------------------------------
| friend1 |  friend2  | pending |
---------------------------------
|    1    |     2     |    0    |
|    2    |     1     |    0    |
|    3    |     1     |    0    |
|    1    |     3     |    0    |
---------------------------------

此表顯示 user_id 1 是 2 和 3 的朋友
2 不是 3 的朋友,而是 1 的朋友。

因此,如果用戶登錄 user_id 2,我希望它建議 user_id 3,因為他們都是 user_id 1 的朋友。


到目前為止我所擁有的:

  public function friendList($user_id = null){
    if(!$user_id){
      $user_id = $this->_data->user_id;
    }
    $query = "SELECT friend2 FROM user_friends WHERE pending = 0 AND ((friend1 = ".$user_id.") AND (friend2 IN (SELECT user_id FROM users WHERE active = 1 AND user_id = friend2)))";
    $data = $this->_db->hardquery($query);
    return $data->results();
  }
  public function suggestUsers(){
    $user_id = $this->_data->user_id;
    $my_friends = array();
    $suggest_friends = array();
    foreach($this->friendList() as $friend){
      array_push($my_friends,$friend->friend2);
    }
    foreach($my_friends as $friend_id){
      foreach($this->friendList($friend_id) as $friendOfFriend){
        $friendOfFriend = $friendOfFriend->friend2;
        if(!in_array($friendOfFriend,$my_friends) && $friendOfFriend != $user_id){
          array_push($suggest_friends,$friendOfFriend);
        }
      }
    }
    foreach($suggest_friends as $sgf){
      $sgf = new user($sgf);
      $sgf = $sgf->data();
      echo "<a href=\"#\">".$sgf->display."</a><br>";
    }
  }

它可以工作,列出用戶朋友的朋友,但沒有添加用戶......
但是,我無法根據誰擁有最多共同朋友來對它進行排序,我想這沒問題(盡管我希望可以),
但這似乎也不是一種非常有效的方法。

似乎這將需要大量資源,必須通過用戶的所有朋友,特別是如果用戶添加了幾百到一千個朋友,並且他們添加了幾百到一千,等等。

我對高級 SQL 不太熟悉,所以我不確定我會如何去做。

這是使用 1 個查詢執行此操作的嘗試。 這個想法是選擇friend2列表,並將其加入一個選擇,其中friend2friend1 使用GROUP BY ,我們可以返回按友誼相關性排序的行,以及與該人是朋友的每個人。

SELECT 
    a.friend2, 
    COUNT(*) as relevance, 
    GROUP_CONCAT(a.friend1 ORDER BY a.friend1) as mutual_friends 
FROM 
    user_friends a
JOIN 
    user_friends b
ON  (
     b.friend2 = a.friend1
     AND b.pending = 0 
     AND b.friend1 = LOGGED_IN_USER
    )
WHERE 
    a.pending = 0
AND 
    a.friend2 != LOGGED_IN_USER
GROUP BY 
    a.friend2
ORDER BY 
    relevance DESC;

一個sqlFiddle 示例 - http://sqlfiddle.com/#!9/3dbf0/3

編輯

在我的原始查詢中,我忘記排除已經是LOGGED_IN_USER朋友的任何用戶。 通過在不存在友誼的情況下使用LEFT JOINIS NULL ,這應該會返回您想要的結果。

SELECT 
    a.friend2, 
    COUNT(*) as relevance, 
    GROUP_CONCAT(a.friend1 ORDER BY a.friend1) as mutual_friends 
FROM 
    user_friends a
JOIN 
    user_friends b
ON  (
     b.friend2 = a.friend1
     AND b.pending = 0 
     AND b.friend1 = LOGGED_IN_USER
    )
LEFT JOIN
    user_friends c
ON
    (
     c.friend2 = a.friend2 
     AND c.pending = 0 
     AND c.friend1 = LOGGED_IN_USER
    )     
WHERE 
    a.pending = 0
AND
    c.friend1 IS NULL
AND 
    a.friend2 != LOGGED_IN_USER
GROUP BY 
    a.friend2
ORDER BY 
    relevance DESC;

更新的sqlFiddle 示例 - http://sqlfiddle.com/#!9/c38b5c/2

您可以通過單個 sql 查詢來做到這一點。 您應該為此編寫 sql 內部子查詢。 看看下面的查詢。 當給定登錄用戶 id 時,它返回共同的朋友 id。

$sql= "SELECT `friend2` FROM `user_friends` WHERE `friend1` IN (SELECT `friend2` FROM `user_friends` WHERE `friend1`=$logged_in_user_id) AND `friend2` != $logged_in_user_id";

只需傳遞變量$logged_in_user_id的登錄用戶 ID。 如果您想知道如何編寫 sql 子查詢,您可以通過查看Sql 子查詢鏈接來學習。

以下函數將輸出共同好友數據。

public function testSuggest(){
    $logged_in_user_id = $this->_data->user_id;
    $suggest_friends = array();
    $sql = "SELECT `friend2` FROM `user_friends` WHERE `friend1` IN (SELECT `friend2` FROM `user_friends` WHERE `friend1`=$logged_in_user_id) AND `friend2` != $logged_in_user_id AND `friend2` IN (SELECT `user_id` FROM `users` WHERE `active`=1 AND `user_id` = `friend2`)";
    $data = $this->_db->hardquery($sql);
    foreach($data->results() as $mutuals){
          array_push($suggest_friends,$mutuals);
    }
    foreach($suggest_friends as $sgf){
      $sgf_user = new user($sgf);
      $sgf_user_data = $sgf_user->data();
      echo "<a href=\"".config::get('site/url')."/u/".$sgf_user_data->username."\">".$sgf_user_data->display."</a><br>";
    }
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM