首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从社交网络sql数据库中通过一个查询获得朋友的社交地图?

如何从社交网络sql数据库中通过一个查询获得朋友的社交地图?
EN

Stack Overflow用户
提问于 2011-04-28 07:56:44
回答 1查看 952关注 0票数 1

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

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

  • “用户”表,其中用户由一个名为guid的唯一id标识。
  • 和“关系”表,其中的朋友关系由(guid_one," friend ",guid_two)三胞胎表示。

Elgg中的朋友关系既可以是单向的,也可以是双向的,更像是Twitter的“跟踪”关系。保证了关系三重态的唯一性。

简短的例子:考虑(1,"Joe"),(2,"Jack") (3,"Jim")用户和以下关系(1,“朋友”,2),(2,“朋友”,1),(1,“朋友”,3),(2,“朋友”,3),这可以解释为

  1. 乔和杰克是共同的朋友(互相跟随)
  2. 吉姆后面跟着乔和杰克。

我想得到的是

  • 任何给定用户的朋友之间所有关系的列表。
  • 按关系数量的降序排列(即,首先列出那些追随我大多数朋友的朋友的关系)
  • 最好是在一个查询中

做这件事最有效的方法是什么?

到目前为止,我有一个编辑:

代码语言:javascript
复制
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。这有两个主要的问题:它不是由关系的数量来排序的,而是因为有很多连接而缓慢得令人痛苦。此外,它也只有一种方式的关系(谁是跟踪谁在我的朋友)-然而,这可以通过一个联合解决,我认为。

有什么改进的办法吗?

EN

回答 1

Stack Overflow用户

发布于 2011-04-28 08:55:36

您可以对存储过程执行BFS。使用给定的用户初始化表,BFS的每一步都将在此表中插入用户的朋友。距离(或啤酒花)可以是此过程的参数。

编辑:BFS如何工作(维基百科)。存储过程(mysql)、循环和递归(mysql)和堆栈过流的工作方式

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5815439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档