1

我希望能够从我的应用程序返回一个用户列表,其中当前用户的 Facebook 朋友首先列出。我看到有一些方法可以查询 Graph API 以返回使用应用程序的用户的朋友,但我希望能够显示在我的网站上采取了特定操作的用户列表,并按照首先列出的 FB 朋友对他们进行排序,所以每当我显示用户列表时,我都可以进行这种排序。

我见过的最好的例子是在 meetup.com 上。他们在显示参加聚会的人员列表时会这样做。这是一个例子:

Meetup 如何首先对包含 FB 好友的用户列表进行排序的示例

我不知道它会对任何人产生任何影响,但它是一个 Rails 应用程序,我正在使用 OmniAuth 通过 Facebook 进行身份验证。

4

2 回答 2

2

您无法按好友状态排序,因为没有好友状态列。您不能执行任何复杂的 SQL 操作,将朋友表与另一个表连接或联合,因为 FQL 不支持这些操作。您能做的最好的事情就是通过单独的查询来确定朋友是谁......

SELECT uid FROM friend WHERE uid IN (...ALL USER IDs...)

从该查询返回的所有uid都将是您完整列表的一个子集,仅包括那些是朋友的人。

附加信息

Meetup 应用程序是...

  1. 首先查询它的本地数据库以生成参与者列表。(让我们调用结果 [ participants] )
  2. 然后,他们对 facebook好友数据库执行查询,以确定其中哪些 [ participants] 是好友。(让我们调用结果 [ participating_friends] )

    从朋友那里选择 uid WHERE uid IN ([ participants])

  3. participating_friends他们还将 [ ] uid 的列表存储在本地数据库中。一列是用户的 id ( uid ),另一列是他们朋友的 uid ( friendid )。

  4. 最后,为了确定朋友的朋友,他们使用如下查询查询本地朋友数据库(从 3 开始):

    从local_friends WHERE uid IN ([ participating_friends])中选择friendid

更新:回想起来,Meetup 可能会撒下更广泛的网络,如下所示:

Meetup 应用程序是...

  1. 首先查询它的本地数据库以生成参与者列表。(让我们调用结果 [ participants] )
  2. 然后,他们对 facebook好友数据库执行查询,以确定其中哪些 [ participants] 是好友。(让我们调用结果 [ participating_friends] )

    从朋友那里选择 uid WHERE uid IN ([ participants])

  3. 确定应用程序用户的所有朋友也是应用程序用户,并将结果存储在本地数据库中,保存uid和相关联的friendid

    SELECT uid FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = me()) AND is_app_user

  4. 最后,确定朋友的朋友,计算新的集合:

    [ participants_not_friends] = [ participants] - [ participating_friends]。

    然后使用如下查询查询本地好友数据库(从 3 开始):

    从local_friends WHERE uid IN ([ participants_not_friends])中选择friendid

于 2012-08-01T22:37:31.330 回答
0

是的,您可以获得每个用户的好友列表。这是我将如何做到的。

在注册时,如果用户在 Facebook 上注册,您将他们的 ID 存储在数据库中。

当经过身份验证的用户查看您的一条记录时,通过 API 发出此 FQL 查询:

SELECT uid, name, pic_square, mutual_friend_count FROM user 
 WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = me())
   AND is_app_user 
 ORDER BY mutual_friend_count DESC

这将使您返回您的应用程序的其他用户,这些用户与当前用户是朋友,按您的应用程序用户和每个朋友之间的共同朋友计数排序(假设更亲密的朋友有更多的共同朋友)。

您可以通过将此查询的结果与数据库中存储的 Facebook id 进行比较,将此列表与数据库中的任何其他指标进行比较。

显示朋友的朋友是一个更棘手的提议。如果您尝试此查询:

SELECT uid2 FROM friend WHERE uid1 IN 
 (SELECT uid2 FROM friend WHERE uid1 = me() LIMIT 1)

它会引发权限错误。Facebook 不允许你交朋友的朋友。

如果它对您的应用很重要,您可以通过在每次登录时缓存每个应用用户的最新朋友列表(或者如果您还要求提供扩展访问令牌,则按计划)并查询此表以查看是否与所有用户的朋友有共同的朋友。您需要仔细查看 TOS 以了解其合法性。

于 2012-08-17T20:46:06.160 回答