2013-03-04 2 views
0

이 MySQL 문을 수행하는 가장 좋은 방법을 찾지 못했습니다.union이 잘못된 결과를 반환하는 MySQL 쿼리

첫 번째 표 '친구'는 사용자 ID, friendID 및 상태가

두 번째 테이블 '사용자'는 이름, 성, 사용자 ID

'users_temp가'tempUserID를 가지고 세 번째 테이블, tempUserName

있다

나는 'users'또는 'friendID = 1'인 'friends'에서 모두 하나의 쿼리를 가져오고 다른 필드에 가입하려고합니다. (사용자 ID = 1이면 friendID를, 그렇지 않으면 friendID = 1, 사용자 ID를 가져올 경우) 'users'/ 'users_temp' '여기서 해당 userID = users.userID 및 존재하는 경우 users_temp 조인합니다.

지금 당장 가지고 있지만 잘못된 결과가 계속 표시됩니다. 또한 반환 아이디 (이가 친구 목록이기 때문에) 그래서 난 그냥 내가 더 내 SQL 설치 설명 할 것입니다 희망 sqlfiddle을 만들어

SELECT users.userid, 
     users.fbid    AS fbID, 
     users.firstname   AS firstName, 
     users.lastname   AS lastName, 
     users.phonenumber  AS phoneNumber, 
     users.avatar   AS avatar, 
     users_temp.tempusername AS tempUserName, 
     status, 
     friendid 
FROM users 
     JOIN (SELECT friendid, 
        userid, 
        status 
      FROM friends 
      WHERE friendid = $userid 
        AND ((status != 2) 
          AND (status != 3)) 
      UNION ALL 
      SELECT friendid, 
        userid, 
        status 
      FROM friends 
      WHERE userid = $userid 
        AND ((status != 2) 
          AND (status != 3))) foo 
     ON users.userid = foo.userid 
     LEFT JOIN users_temp 
       ON users.userid = users_temp.tempuserid 

사용자 당 1을 반환 고유해야합니다

http://sqlfiddle.com/#!2/690c3/4

도움이 될 것입니다.

감사합니다,

웨스

+0

흠 ..'UNION ALL' 대신에'UNION'을 시도해보십시오. – Kermit

+0

그걸로 운이 없음. – Wes

답변

0

지금까지 내가 말할 수있는 문제는 당신이 당신의 unionall 쿼리

을의 두 번째 부분에서 잘못된 필드주십시오 참여하고있는 것을 할 수있다 다음을 시도하십시오

SELECT users.userid, 
    users.fbid    AS fbID, 
    users.firstname   AS firstName, 
    users.lastname   AS lastName, 
    users.phonenumber  AS phoneNumber, 
    users.avatar   AS avatar, 
    users_temp.tempusername AS tempUserName, 
    status 
FROM users 
    JOIN (SELECT friendid AS joinid, 
      userid AS otherid, 
      status 
    FROM friends 
    WHERE friendid = 1 
      AND ((status != 2) 
        AND (status != 3)) 
    UNION ALL 
    SELECT userid AS joinid, 
      friendid AS otherid, 
      status 
    FROM friends 
    WHERE userid = 1 
      AND ((status != 2) 
        AND (status != 3))) foo 
    ON users.userid = foo.otherid 
    LEFT JOIN users_temp 
     ON users.userid = users_temp.tempuserid 

편집 : unionall의 두 번째 하위 쿼리에서 열 순서가 변경되었습니다. 기본 쿼리에 friendid 열이 정말로 필요합니까? 아니면 다른 사람이 할 것인가?

+0

그걸로 운이 없습니다. 그게 http://sqlfiddle.com/#!2/690c3/4 도움이되면 내 데이터베이스의 구조를 넣어 – Wes

관련 문제