친구

2016-12-30 1 views
5

나는 데이터베이스에 친구를 저장 (뿐만 아니라)를 사용하여이 테이블을 가지고 :친구

user_1 | user_2 | status 

'상태가'-1,0 할 수있는 여기서는 상태가 '0'(사용자 _에 대해 보류 중)이거나 '1'(사용자 _2에 의해 승인 됨) 인 경우 만 고려합니다. 나는 주어진 $ 사용자에 대한 승인/친구 보류 찾기 위해 다음과 같은 쿼리를 가지고 :

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 각 친구의 친구를 나열 할 : 예를 들어, 우리는 다음과 같은 항목이 있다고 가정 해 봅시다 :

가 EDIT 당신의 도움에 미리으로

감사합니다 'a', 'b'가 f와 'a'의 공통 친구인지 확인하십시오. 또한 상호 테스트의 경우 f =/= b입니다. 이러한 쿼리의 결과는 다음과 같습니다

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

당신은 내가 나 자신을 사용하지 않을 것이라고, 그래서 복잡하고 느린 것 MySQL의 쿼리에서와 같이 더 명확하게

+0

나는 그것을 얻지 못한다 :-) 당신은 무엇을 사고 싶습니까? 어쩌면 간단한 예제일까요? –

+0

이고'c |는 어디에 있는가? a | 1 | d'? MySQL에서는 그렇게하지 않지만 PHP 나 다른 언어를 사용하면 MySQL은 더 큰 데이터 세트에서 느려질 것입니다. –

+0

네 번째 필드 shoult는 'b'와의 상호 우정을 테스트하기 때문에, 당신이 자고있는 라인은 나타나지 않아야합니다. 또 다른 가능성은 실제로 PHP에서이를 수행하고 'b'와의 상호 우정을 테스트하기 위해 항목 당 쿼리를 실행하는 것입니다. 하지만이 방법을 여러 번 보내는 것은 좌회전과 함께 하나의 쿼리 만 보내는 속도가 느려지는 것을 두려워했습니다. 하지만 어쩌면 그게 맞을지 모르지만,이 –

답변

1

필요하면 알려주세요, 여기에 하나의 쿼리 만 사용하는 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; 
} 

?> 

테스트되지 않았으므로주의하십시오. 사소한 구문 오류가있을 수 있지만 상호적인 친구들의 배열을 반환해야합니다.

+0

실제로, 이것은 아주 좋은 대안 :) 도움을 주셔서 감사합니다! 나는 그것이 시험되는대로 알려 드리겠습니다. –

1

플래시 천둥 기능 게시물을 약간 수정했습니다. 그냥 몇 가지 수정 사항을 테스트하고 그것을 작동합니다! 다시 한번 감사드립니다.

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