由Facebook好友订购的MySQL

时间:2012-10-23 10:06:47

标签: php mysql facebook facebook-graph-api

我需要一种方法来订购行列表并将用户的Facebook好友放在第一位。

我有什么方法可以做到吗?我应该采用哪种方法?

我从未使用过Facebook Connect,所以这只是一个假设的问题,因为我很快就会使用它。

每次用户搜索时都会获取Facebook好友列表(并且会生成列表)。然后在我的表中,我将保存每个用户的facebook_uid?

但我如何订购,以便Facebook的朋友是第一个,之后会出现“陌生人”?

我的表格可能如下所示:

id - facebook_uid - text
1  - 1111111      - lorem ipsum.....
2  - 2222222      - something else....
3  - 3333333      - third!!!

因此,如果例如1111111和3333333是我的朋友,那么返回的ID将是(按照正确的顺序):1,3,2。

如何在SQL(或PHP逻辑)中订购?

3 个答案:

答案 0 :(得分:1)

我用两个阵列跟随罗宾的方法。

首先,我从Graph加载Facebook好友列表(json)。然后我循环遍历它,创建一个只有朋友ID的数组。这样,我可以使用in_array来检查特定ID是否是朋友。

<?php
function get_facebook_friends(){
    $friends = json_decode(file_get_contents("https://graph.facebook.com/me/friends?access_token=XXXXXX"));
    $friendArray = array();

    foreach($friends->data as $friend){
        $friendArray[] = $friend->id;
    }

    return $friendArray;
}

function is_facebook_friend($friends, $facebook_uid){   
    return in_array($facebook_uid, $friends);
}

//Do your query stuff...

$friends = get_facebook_friends();
$is_friends = array();
$not_friends = array();

foreach ($rows as $row){
    if(is_facebook_friend($friends, $row->facebook_uid)){ //Is friend
        $is_friends[] = $row;
    }else{
        $not_friends[] = $row;          
    }
}

$rows = array_merge($is_friends, $not_friends);

//Do normal loop here
?>

非常有效和快速。

答案 1 :(得分:0)

Facebook图表可以使用fql。虽然它基于SQL,但它有一些限制,例如缺少NOT IN()和东西。通过在表friend中运行所有已采用的facebook_id,您可以通过查询找出他们是否是朋友。

这假设您存储了所有ID。让我们说你搜索,并获得10个结果。通过friend表运行所有这些id,如:

SELECT uid2 FROM friend WHERE uid1 = me() AND uid2 IN ({$search_user_1}, {$search_user_1}, ...)

返回的uid2显然是特定人的朋友。

<强>更新

我怀疑fql可以根据需要处理UNIONsubqueries。但是我的解决方案仍然是相同的。

提取行,通过Facebook的api运行fql并比较匹配。如果它们匹配,您可以将它们放入数组$friends,其他$not_friends然后$users = array_merge($friends, $not_friends),然后对它们进行排序。用你的想象力。

这个,或者首先运行fql以获取当前用户的朋友,然后将它们添加到您自己的数据库中,每个访问日/小时/页面。然后只需运行JOIN来检查他们是不是朋友。

答案 2 :(得分:0)

  

因此,如果例如1111111和3333333是我的朋友,那么返回的ID将是(按照正确的顺序):1,3,2。

     

如何在SQL(或PHP逻辑)中订购?

我认为这应该足够了(在MySQL中):

… ORDER BY IF(facebook_uid IN (1111111,3333333), 1, 0) DESC

如果记录的facebook_uid在给定列表中,则导致“排序值”为1,否则为0。对它进行排序DESCending使得1值在0值之前。

将逗号分隔的朋友ID的实际列表插入到IN运算符的括号中应该没什么大不了的,例如,如果将它们作为数组使用,则可以使用逗号作为分隔符将它们内爆。