用户的朋友+与另一个用户的共同朋友测试

时间:2016-12-30 23:32:23

标签: mysql sql

我有这个表(但不仅仅是)用于在数据库中存储朋友:

user_1 | user_2 | status

其中'status'可以是-1,0或1.这里,我们将仅考虑状态为'0'(等待user_1)或'1'(由user_2批准)的情况。我有以下查询来查找给定$ user的待定/已批准的朋友:

SELECT user_1,user_2,status
         FROM Friends
         WHERE (user_2 = '$user' OR user_1 = '$user') AND status >= 0;

此处的目标是修改查询以告知给定的$ user2是否是$ user1的常见(已批准)朋友以及$ user1的每个(已批准)朋友。

经过一些研究,我发现左连接可以通过将另一个字段设置为NULL(如果没有相互)或$ user2来实现。我想要有效地做到这一点。我尝试了几次,但没有成功。

先谢谢你的帮助

编辑:例如,假设我们有以下条目:

a | b | 1
c | a | 1
c | b | 1
a | d | 1

我想列出'a'的朋友和'a'的每个朋友f,确认'b'是f和'a'的共同朋友。另外,f = / = b用于相互测试。这种查询的结果将是:

a | b | 1 | NULL
c | a | 1 | b
a | d | 1 | NULL

如果您需要更多说明,请告诉我

2 个答案:

答案 0 :(得分:1)

正如在MySQL中查询会如此复杂和缓慢,我自己也不会使用它,这里是PHP的解决方案,只有一个查询:

<?php

// $db = mysqli_connect(...);

function findMutualFriends($of,$mutual_with){
    global $db;
    $user_friends = array();
    $mutual_friends = array();
    $results = array();

    $res = mysqli_query($db,"SELECT user_1,user_2,status FROM Friends WHERE ((user_2 = '$of' OR user_1 = '$of') OR (user_2 = '$mutual_with' OR user_1 = '$mutual_with')) AND status >= 0;";
    while($row = mysqli_fetch_assoc($res)){
        if($row['user_1'] == $of || $row['user_2'] == $of){
            $user_friends[] = (($row['user_1'] == $of) ? $row['user_2'] : $row['user_1']);
        }
        if($row['user_1'] == $mutual_with || $row['user_2'] == $mutual_with){
            $mutual_friends[(($row['user_1'] == $mutual_with) ? $row['user_2'] : $row['user_1'])] = 1;
        }
    }
    foreach($user_friends as $friend){
        if($mutual_firends[$friend]){
            $results[] = $friend;
        }
    }
    return $results;
}

?>

请注意,它尚未经过测试。可能包含一些小的语法错误,但应该返回一个共同朋友的数组。

答案 1 :(得分:1)

我修改了一下Flash Thunder的功能帖子。刚测试了一些修改,它的工作原理!再次感谢。

function findMutualFriends($pdo, $of,$mutual_with){

    $user_friends = array();
    $mutual_friends = array();
    $results = array();

    $query = "SELECT user_1,user_2,status FROM Friends WHERE ((user_2 = '$of' OR user_1 = '$of') OR (user_2 = '$mutual_with' OR user_1 = '$mutual_with')) AND status = 1;";
    $prep = $pdo->prepare($query);
    $res = $prep->execute();
    $rows = $prep->fetchAll();
    foreach ($rows as $row) {
        if($row['user_1'] == $of || $row['user_2'] == $of) {
            $user_friends[] = ($row['user_1'] == $of ? $row['user_2'] :$row['user_1']);
        }
        if($row['user_1'] == $mutual_with || $row['user_2'] == $mutual_with) {
            $mutual_friends[($row['user_1'] == $mutual_with ? $row['user_2'] :$row['user_1'])] = true;
        }
    }

    foreach($user_friends as $friend) {
        $results[$friend] = $mutual_friends[$friend] == true ? true : false;
    }
    return $results; 
}