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

标签 php mysql sql select

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

我很难弄清楚如何根据 mutual_friend 计数吸引用户和订购。

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

这是我的表格结构:

users table
-----
user_id | name |

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

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

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

  • 我是ABC是我的 friend 。
  • DE 又是 B 的 friend 。
  • D 也是 C 的友元,但 E 不是 C 的 friend 。
  • F 不是站点中任何人的 friend 。

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

因为 DBC 的 friend ,而 E< em>只有 B:

  • AD2 个共同的 friend 。
  • AE1 个共同的 friend 。
  • AF0 个共同的 friend 。

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

$myfriends = "2,3";//把我所有的 friend 放在一个变量中

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

但它会根据 user_id ASC 产生。

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

我是 Auser_id = 1

有更多共同 friend 的人优先

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

最佳答案

此查询将考虑关系的互惠性,因此无论关系是“从 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是 friend ,A和C是 friend (注意倒置关系),B和D是 friend ,E和B是 friend (另一种倒置关系),C和 D 是 friend 。

假设你想要的人的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/

相关文章:

php - 如果 PHP 在 Linux 上运行;如何获取特定的发行版(Ubuntu、fedora 等)?

javascript - 根据在此子类别中选择的选项动态更改子类别选择选项

php - 将纯 PHP 代码转换为 codeigniter

php - 使用 WHERE 时出现 SQL 语法错误

sql - 返回多对多连接的唯一组合

mysql - 如何从2个表中获取所有数据

c# - 使用 C# SQL Server 调用在 "Using"范围内自动回滚吗?

php - 为什么我不能在我的 php 脚本中使用 session_start()?它说标题已经发送

mysql - 合并MySQL多表删除语句

mysql - 在 Mysql 中使用 Against 中的子查询进行全文搜索