gpt4 book ai didi

mysql - 如何从社交网络sql数据库中通过单个查询获取 friend 的社交 map ?

转载 作者:行者123 更新时间:2023-11-29 00:56:36 25 4
gpt4 key购买 nike

我有一个建立在 Elgg 之上的社交网站(php + mysql) 框架。我的目标是获得给定用户的所有 friend ,以及这些 friend 之间的 friend 关系。

我需要的所有信息都在两个表中:

  • “用户”表,其中用户由称为 guid 的唯一 ID 标识
  • 和“关系”表,其中 friend 关系由 (guid_one, "friend", guid_two) 三元组表示

Elgg中的好友关系既可以是单向的也可以是双向的,更像是Twitter的“关注”关系。保证关系三元组的唯一性。

简短示例:考虑 (1, "Joe"), (2, "Jack") (3, "Jim") 用户和以下关系 (1, "friend", 2), (2, "friend", 1), (1 , "friend", 3), (2, "friend", 3), 这可以解释为

  1. Joe 和 Jack 是共同的 friend (互相关注)
  2. Jim 后面跟着 Joe 和 Jack

我想得到的是

  • 任何给定用户的 friend 之间的所有关系列表
  • 按关系数量的降序排列(即,首先列出关注我 friend 最多的 friend 的关系)
  • 最好在单个查询中

执行此操作的最有效方法是什么?

编辑到目前为止我有这个:

SELECT
u1.guid, u1.name, u2.guid, u2.name
FROM
users u1
INNER JOIN relationships r1 ON
(u1.guid = r1.guid_one AND r1.relationship = "friend")
INNER JOIN users u2 ON (r1.guid_two = u2.guid)
INNER JOIN relationships r2 ON
((r2.guid_one = xxx AND r2.guid_two = u1.guid)
OR (r2.guid_two = xxx AND r2.guid_one = u1.guid))
INNER JOIN relationships r3 ON
((r3.guid_one = xxx AND r3.guid_two = u2.guid)
OR (r3.guid_two = xxx AND r3.guid_one = u2.guid))

其中 xxx 代表我感兴趣的用户的 guid。这有两个主要问题:它不是按关系的数量排序,而且由于有很多连接,速度非常慢。它也只有一种方式的关系(我的 friend 中谁在关注谁)——但我认为这可以通过工会来解决。

有什么改进的想法吗?

最佳答案

您可以对存储过程执行 BFS。用给定的用户初始化表,BFS 的每一步都会将此表中用户的 friend 插入到此表中。距离(或跳数)可以是这个过程的参数。


编辑:BFS 的工作原理 ( wikipedia )。存储过程如何工作(mysql)、循环和递归(mysql)和stackoverflow

关于mysql - 如何从社交网络sql数据库中通过单个查询获取 friend 的社交 map ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5815439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com