具有联合返回错误结果的 MySQL 查询

Posted

技术标签:

【中文标题】具有联合返回错误结果的 MySQL 查询【英文标题】:MySQL query with union returning wrong results 【发布时间】:2013-03-04 00:31:21 【问题描述】:

我无法找出执行此 mysql 语句的最佳方法。

第一个表 'friends' 有 userID、friendID 和 status

第二个表'users'有firstName、lastName、userID

第三个表'users_temp'有tempUserID,tempUserName

我希望有一个查询从用户 ID 或朋友 ID = 1 的“朋友”中全部提取并加入另一个字段(如果用户 ID = 1,则获取朋友 ID,或者如果朋友 ​​ID = 1,则获取用户 ID)到“用户”/ '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

任何帮助将不胜感激!

谢谢,

韦斯

【问题讨论】:

嗯.. 试试UNION 而不是UNION ALL 运气不好。 【参考方案1】:

据我所知,问题可能是您在 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 列吗?或者其他人会做吗?

【讨论】:

不走运。如果有帮助,我将数据库的结构放在这里sqlfiddle.com/#!2/690c3/4

以上是关于具有联合返回错误结果的 MySQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

Mysql注入 -- 联合注入

mySQL 返回错误的计数结果

MySQL联合查询

在结果集中放置一个联合查询

MySQL:向 UNION 查询添加标识字段

MySql:联合查询