Php MySQL查询以查找您尚未成为好友的用户,并按好友数排序

Php MySQL查询以查找您尚未成为好友的用户,并按好友数排序,php,mysql,laravel-4,Php,Mysql,Laravel 4,我有一个社交网站类型的网站,我在拉威尔4.2工作 基本用户表 还有一张储存友谊的桌子,叫做“关系” 我很难弄清楚如何通过共同的朋友数量来获取用户和订单 我试图建立一个页面,显示一个推荐朋友的列表,这正是我上面所描述的 我对拉雷维尔还不太熟悉。。但是我想说这更像是一个SQL问题。感谢您的帮助 下面是我在另一个搜索页面上使用的一些代码。。但这只是为了比较两个用户,所以它可能会帮助您,也可能不会帮助您 public function mutualFriendCount($user1Id, $user2

我有一个社交网站类型的网站,我在拉威尔4.2工作

基本用户表

还有一张储存友谊的桌子,叫做“关系”

我很难弄清楚如何通过共同的朋友数量来获取用户和订单

我试图建立一个页面,显示一个推荐朋友的列表,这正是我上面所描述的

我对拉雷维尔还不太熟悉。。但是我想说这更像是一个SQL问题。感谢您的帮助

下面是我在另一个搜索页面上使用的一些代码。。但这只是为了比较两个用户,所以它可能会帮助您,也可能不会帮助您

public function mutualFriendCount($user1Id, $user2Id)
{
    $user1Friends = array();
    $user2Friends = array();

    //build array of friends for user1 and user2 
    $user1Connections = Connection::whereStatus('approved')
        ->where(function($query) use($user1Id){
           $query->orWhere('user1_id', '=', $user1Id);
           $query->orWhere('user2_id', '=', $user1Id);
        })->orderBy('created_at')->select('user1_id' , 'user2_id')->get();


    foreach ($user1Connections as $user1Connection) {
        if($user1Connection->user1_id != $user1Id && $user1Connection->user1_id != $user2Id) {
            $user1Friends[] = $user1Connection->user1_id;
        }
        if($user1Connection->user2_id != $user1Id && $user1Connection->user2_id != $user2Id) {
            $user1Friends[] = $user1Connection->user2_id;
        }
    }

    $user2Connections = Connection::whereStatus('approved')
        ->where(function($query) use($user2Id){
           $query->orWhere('user1_id', '=', $user2Id);
           $query->orWhere('user2_id', '=', $user2Id);
        })->orderBy('created_at')->select('user1_id' , 'user2_id')->get();


    foreach ($user2Connections as $user2Connection) {
        if($user2Connection->user1_id != $user1Id && $user2Connection->user1_id != $user2Id) {
            $user2Friends[] = $user2Connection->user1_id;
        }
        if($user2Connection->user2_id != $user1Id && $user2Connection->user2_id != $user2Id) {
            $user2Friends[] = $user2Connection->user2_id;
        }
    }

    //compare the arrays and return the count
    return count(array_intersect($user1Friends, $user2Friends));

}

所以基本上给定一个“user1_id”,你想找到这个人的所有朋友的朋友,他们还没有和user1成为朋友?弗雷德和乔治是朋友,而乔治和哈里是朋友。如果哈利不是弗雷德的朋友,那么把哈利也包括在结果中?@MarcB你明白了。。给定一个用户id。请记住,如果我的用户id为7。。可以显示user1\u id或user2\u id。。这取决于谁发送了好友请求。但是,connections表中永远不会有2条记录具有相同的2个用户id。。如。。如果有一个user1\u id=7和user2\u id=3的记录。。。永远不会有另一个user1\u id=3和user2\u id=7的用户。希望这有助于基本上只是一个3路自连接。users->users as friends->users as friends\u of friends,然后
其中users.user1\u id不存在friends\u of friends.user2\u id
之类的东西。@MarcB不确定我是不是在跟踪你First join给你Fred的朋友。第二次加入给弗雷德朋友的朋友。第三次加入可以让你找到所有与弗雷德不是朋友的朋友的朋友。
public function mutualFriendCount($user1Id, $user2Id)
{
    $user1Friends = array();
    $user2Friends = array();

    //build array of friends for user1 and user2 
    $user1Connections = Connection::whereStatus('approved')
        ->where(function($query) use($user1Id){
           $query->orWhere('user1_id', '=', $user1Id);
           $query->orWhere('user2_id', '=', $user1Id);
        })->orderBy('created_at')->select('user1_id' , 'user2_id')->get();


    foreach ($user1Connections as $user1Connection) {
        if($user1Connection->user1_id != $user1Id && $user1Connection->user1_id != $user2Id) {
            $user1Friends[] = $user1Connection->user1_id;
        }
        if($user1Connection->user2_id != $user1Id && $user1Connection->user2_id != $user2Id) {
            $user1Friends[] = $user1Connection->user2_id;
        }
    }

    $user2Connections = Connection::whereStatus('approved')
        ->where(function($query) use($user2Id){
           $query->orWhere('user1_id', '=', $user2Id);
           $query->orWhere('user2_id', '=', $user2Id);
        })->orderBy('created_at')->select('user1_id' , 'user2_id')->get();


    foreach ($user2Connections as $user2Connection) {
        if($user2Connection->user1_id != $user1Id && $user2Connection->user1_id != $user2Id) {
            $user2Friends[] = $user2Connection->user1_id;
        }
        if($user2Connection->user2_id != $user1Id && $user2Connection->user2_id != $user2Id) {
            $user2Friends[] = $user2Connection->user2_id;
        }
    }

    //compare the arrays and return the count
    return count(array_intersect($user1Friends, $user2Friends));

}