我有一个建立在埃尔格 (php + mysql)框架之上的社交网站。我的目标是获得一个给定用户的所有朋友,以及这些朋友之间的朋友关系。
我所需要的所有信息都在两个表格中:
Elgg中的朋友关系既可以是单向的,也可以是双向的,更像是Twitter的“跟踪”关系。保证了关系三重态的唯一性。
简短的例子:考虑(1,"Joe"),(2,"Jack") (3,"Jim")用户和以下关系(1,“朋友”,2),(2,“朋友”,1),(1,“朋友”,3),(2,“朋友”,3),这可以解释为
我想得到的是
做这件事最有效的方法是什么?
到目前为止,我有一个编辑:
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。这有两个主要的问题:它不是由关系的数量来排序的,而是因为有很多连接而缓慢得令人痛苦。此外,它也只有一种方式的关系(谁是跟踪谁在我的朋友)-然而,这可以通过一个联合解决,我认为。
有什么改进的办法吗?
发布于 2011-04-28 08:55:36
您可以对存储过程执行BFS。使用给定的用户初始化表,BFS的每一步都将在此表中插入用户的朋友。距离(或啤酒花)可以是此过程的参数。
编辑:BFS如何工作(维基百科)。存储过程(mysql)、循环和递归(mysql)和堆栈过流的工作方式
https://stackoverflow.com/questions/5815439
复制相似问题