我正在我的论坛中创建一个好友系统。
我有一个艰难的时间试图找出我将如何抓取用户和按共同的朋友计数订购。
我试图建立一个页面,显示推荐的朋友列表。
以下是我的表格结构:

users table
-----
user_id | name |

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

这是一个正在发生的事情的例子。
假设站点中共有ABCDEF=6人。
我是我的朋友。
AB又是C的朋友。
D也是E的朋友,但B不是D的朋友。
C不是站点中任何人的朋友。
因此从上面的数据看来,EC是我的共同朋友(F)。D不是我的共同朋友。
因为EAF的朋友,而D只是B的朋友:
CE有共同的朋友。
BA有共同的朋友。
D2有共同的朋友。
现在,如果我想搜索(记住我是A)不是我朋友的人,我可以做如下事情:
E
1
但它将在A方面屈服。
我怎样才能让它按F的顺序搜索。?
我是0A
也就是说,拥有更多共同朋友的人是第一位的
有人能告诉我怎么做吗?我被困在这里很久了。我找了很多东西,但找不到。

最佳答案

这个查询会考虑到关系之间的相互作用,所以不管关系是“从A到B”还是“从B到A”,它仍然会返回预期的结果。所以给定这样的表:

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)。

关于php - 按相互好友数搜索-好友系统Mysql PHP,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29039649/

10-11 08:30