Я уже огляделся на этом сайте, но ни один из них не является именно тем, что я ищу. Многие из них говорят о том, как это делает Facebook, или о том, как Twitter делает это, чтобы предложить последователей, но даже тогда они не дают прямого ответа.
Все, что я нахожу, просто вычисляют взаимных друзей, используя два идентификатора пользователя.Подсказать друзей, основанных на общих друзьях
Я хочу, чтобы иметь возможность регистрировать идентификатор пользователя, проходить через своих друзей и проходить через своих друзей, чтобы рассчитать тех, у кого есть самые общие друзья с зарегистрированным пользователем, чтобы предложить людям добавить, что есть самые общие друзья.
Для этого я использую 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>";
}
}
и он работает, перечисляя от друзей, которые друзья друзей пользователя, но не добавил пользователь ...
ОДНАКО, я могу 't сортировать его, исходя из того, у кого самые общие друзья, что, я думаю, все в порядке (хотя я бы хотел, если бы мог),
, но это тоже не очень эффективный способ сделать это.
Кажется, что для этого потребуется много ресурсов, чтобы пройти через всех друзей пользователя, особенно если у пользователя есть ку добавлено от сотни до тысячи друзей, и у них есть пара от тысячи до тысячи и т. д.
Я не знаком с продвинутым SQL, поэтому я не уверен, как бы я это сделал.
все ли дружба в списке дважды, один раз как 'friend1' и один раз как' friend2'? – Sean
@Sean да, для каждой дружбы есть две строки. friend1 всегда является зарегистрированным пользователем, а friend2 всегда является другим пользователем. (Это для простоты, я понимаю, что это может быть не лучший способ сделать это с точки зрения эффективности) – Axiom
@Axiom Можете ли вы увидеть мой ответ. Он возвращает всех общих друзей. Если какая-либо проблема, прокомментируйте ответ. Я помогу тебе. –