2013-03-04 151 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