2016-12-30 133 views
5

我有这个表,我使用(但不仅限于),用于在数据库中存储的朋友:朋友用户+共同的朋友的测试与其他用户

user_1 | user_2 | 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; 

这里的目标是要修改查询也告诉我们,如果给定的$用户2 $常见的(批准)的朋友user1和$ user1的每个(已批准)朋友。

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

感谢由您的帮助

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

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

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

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

让我知道如果你需要更多的澄清

+0

我不明白:-)你想得到什么?也许一些简短的例子? –

+0

和'c | a | 1 | d'?我不会在MySQL中这样做,但是在PHP中或者您正在使用的任何语言中...... MySQL在较大的数据集中速度会很慢。 –

+0

第四场比赛只测试与'b'的相互友谊,这就是为什么你所建议的线不应该出现。另一种可能性就是在PHP中这样做,并为每个条目启动一个查询来测试与'b'的相互友谊。但我担心用这种方式发送多重查询会比较慢,只发送带有左连接的单个查询。但也许你是对的,我很乐意看到有关这 –

回答

1

如MySQL查询会如此复杂而缓慢,我不会用它自己,这里有一个解决方案只有一个查询:

<?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; 
} 

?> 

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

+0

的确,这是一个很好的选择:)感谢您的帮助!我会尽快让你知道它会被测试。 –

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; 
}