2012-11-11 8 views
0

나는 정확히 MySQL 쿼리가 필요로하는 것을 예제로 작성했다. 두 쿼리를 결합하려고 시도했지만 그렇게하지 않았으므로 성공하지 못했다. 기본적으로 $ 세션이 이미 친구가 아닌 모든 사용자를 선택합니다.PHP의 혼란을 하나의 MySQL 쿼리로 바꾼다

내 테이블 구조가 얼마나 멀리 설명해야하는지 모르겠다. 내 쿼리를 사용하여 수행해야 할 작업을 볼 수 있지만 기본적으로 내 친구 테이블에는 각 우정에 대해 하나의 행만 있습니다. state1하고 내 표는 우정에 대해 하나 개의 행이 않기 때문에 CASE 문, 우정의 friends ID를 얻을 필요한 경우 (우정에만 유효합니다. 당신은 반을 원하는

$getUsers = mysql_query("SELECT id FROM users WHERE id!=$session"); 
$getFriends = mysql_query("SELECT CASE WHEN userID=$session THEN userID2 ELSE userID END AS friendID 
            FROM friends 
            WHERE (userID=$session OR userID2=$session) 
            AND state='1'"); 

     $usersArray = array(); 
     $friendsArray = array(); 

     while($usersC = mysql_fetch_array($getUsers)) 
     { 
      $usersID = $usersC['id']; 
      array_push($usersArray, $usersID); 
     } 
     while($usersF = mysql_fetch_array($getFriends)) 
     { 
      $friendID = $usersF['friendID']; 
      array_push($friendsArray, $friendID); 
     } 

     print_r(array_merge(array_diff($usersArray, $friendsArray), array_diff($friendsArray, $usersArray))); 

답변

4

당신이 외부를 통해 영향을 줄 수있는, 조인 및 기록을위한 필터가 조인 된 테이블이 NULL입니다 :.

SELECT users.id 
FROM users LEFT JOIN friends f 
    ON (f.userID = $session AND f.userID2 = users.id AND f.state='1') 
    OR (f.userID = users.id AND f.userID2 = $session AND f.state='1') 
WHERE f.userID IS NULL AND f.userID2 IS NULL 
    AND users.id <> $session 

sqlfiddle에서 볼

+0

감사합니다,이 오 그것과 같다 일하긴했지만 아무 것도 돌려주지 않을거야. (또한 사용자가 친구의 행을 가지고 있지 않은 경우에도 작동해야합니다.) –

+0

잘하면 다음과 같이 유용합니다. http://sqlfiddle.com/#!2/3ad9a/1 –

+0

@DylanCross : 죄송합니다. 'friends' 테이블에 상충되는'id' 컬럼이 있음을 깨닫습니다. - 한정자를 추가하면 그것을 해결해야합니다. 위의 내 대답을 업데이트했습니다. – eggyal

관련 문제