2013-03-04 150 views
0

我無法找出執行此MySQL語句的最佳方法。帶聯合的MySQL查詢返回錯誤結果

第一個表 '朋友' 的用戶ID,friendID和狀態

第二個表 '用戶' 具有名字,姓氏,用戶ID

第三個表 'users_temp' 有tempUserID,tempUserName

我期待有一個查詢全部來自「朋友」,其中userID或friendID = 1,並加入其他字段(如果userID = 1,則抓住friendID或者如果friendID = 1,則抓取用戶ID)到'users'/'users_temp '那個userID = users.userID,如果存在,則留下加入users_temp。

現在我有這個,但它不斷返回錯誤的結果。此外,它返回的用戶ID必須是唯一的,所以我剛回到1%的用戶(因爲這是一個朋友列表)

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 

我創建了一個sqlfiddle我希望將進一步解釋我的SQL安裝

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

任何幫助將不勝感激!

感謝,

韋斯

+0

嗯..試試'UNION'而不是'UNION ALL'? – Kermit 2013-03-04 00:35:27

+0

沒有運氣,以及。 – Wes 2013-03-04 00:40:17

回答

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 2013-03-04 01:13:19