按共同好友数搜索 - 好友系统 Mysql PHP

Search by Mutual Friends Count - Friend System Mysql PHP

我正在我的论坛中创建一个好友系统。

我很难弄清楚如何通过 mutual_friend 计数来吸引用户和订购。

我正在尝试构建一个显示推荐好友列表的页面。

这是我的表格结构:

users table
-----
user_id | name |

friends table
-----
friend_id | from_id | to_id

这是一个正在发生的事情的例子。

假设共有A,B,C,D,E,F = 6人网站。

因此从上面的数据看来DE是我共同的朋友(A)。 F 不是我的共同朋友。

因为 DBC 的朋友,而 E 只有 [=106] 的朋友=]B:

  • AD2 个共同的朋友。
  • AE1 个共同的朋友。
  • AF0 个共同的朋友。

现在如果我想搜索(记住我是 A)不是我朋友的人,我可以这样做:

$myfriends = "2,3"; //putting all my friends in a variable

SELECT * FROM users WHERE user_id NOT IN( $myfriends )

但它会以 user_id ASC 的形式产生。

如何让它按 mutual_friendsDESC 顺序搜索。 ?

我是 Auser_id = 1

共同好友多者优先

谁能告诉我该怎么做?我被困在这里很长一段时间了。我搜索了很多东西,但无法弄明白。

可能是这样的:

Select user_id, friends.to_id, count(friend_of_friend.to_id)
from users left outer join
    friends on users.user_id = friends.from_id left outer join
    users as friend_user on friends.to_id = friend_user.user_id left outer  join
    friends as friend_of_friend on friend_user.user_id =    friend_of_friend.from_id and friend_of_friend.to_id in (select to_id from friends where from_id = users.user_id)
Group by USER_ID, friends.to_id
Order by 3

为清楚起见编辑: 此查询的逻辑取决于多次加入相同的 table。前两个连接非常简单,我们从 table 用户开始,然后加入朋友 table,将每个用户与其所有朋友联系起来。但随后我们再次加入用户 table,但这次使用 "to" 列 - 我们正在获取每个朋友的用户信息。由于我们不能在查询中两次使用相同的 table 名称,因此我们给它一个别名 "friend_user"。然后我们根据 friend_user table 中的 id 再次加入朋友 table - 这为我们提供了每个原始用户朋友的所有朋友。然后我们限制我们使用 "Friend_of_friend.to_id in ..." 返回的朋友的朋友,将朋友的朋友与所有原始用户朋友的列表进行比较,我们通过子查询将其引入 - [= 之后的部分18=] 括在括号中。

这个查询会考虑关系的互惠性,所以不管关系是"From A to B"还是"From B to A",它仍然会return预期的结果。所以给出这样的表:

CREATE TABLE people
    (`id` int, `name` varchar(1))
;

INSERT INTO people
    (`id`, `name`)
VALUES
    (1, 'A'),
    (2, 'B'),
    (3, 'C'),
    (4, 'D'),
    (5, 'E'),
    (6, 'F')
;


CREATE TABLE friends
    (`id` int, `personId1` int, `personId2` int)
;

INSERT INTO friends
    (`id`, `personId1`, `personId2`)
VALUES
    (1, 1, 2),
    (2, 3, 1),
    (3, 2, 4),
    (4, 5, 2),
    (5, 3, 4)
;

我相信这是按照你描述的设置:A和B是朋友,A和C是朋友(注意倒置关系),B和D是朋友,E和B是朋友(另一种倒置关系), C和D是朋友。

假设你要找的人的id在@personId:

SELECT StrangerId, COUNT(MutualFriendId) AS TotalMutualFriends
FROM
(SELECT
  CASE WHEN f.personId2 = mf.friendId THEN f.personId1 ELSE f.personId2 END AS StrangerId,
  CASE WHEN f.personId1 = mf.friendId THEN f.personId1 ELSE f.personId2 END AS MutualFriendId
FROM
(SELECT 
  CASE 
    WHEN personId1 = @personId THEN personId2 
    ELSE personId1 
  END AS friendId 
FROM friends 
WHERE personId1 = @personId OR personId2 = @personId) AS mf
INNER JOIN friends f
ON (personId1 != @personId AND personId2 = mf.friendId) 
  OR (personId1 = mf.friendId AND personId2 != @personId)
 ) AS totals
 GROUP BY StrangerId
 ORDER BY TotalMutualFriends DESC;

@personId = 1 的结果是:

StrangerId  TotalMutualFriends
4           2
5           1

And here is a SQLFiddle 演示(我无法让它允许我设置一个变量,所以它的位置有一个 1)。