繁体   English   中英

如何修复Sql查询

[英]How to fix Sql query

我一直在尝试获取一个查询以返回用户拥有的朋友,在我的成员表中,我有成员的用户ID,名字和姓氏,我在朋友表中有用户ID列和朋友ID列,现在我我将我的会员表与朋友表相结合,这样我就能得到朋友的名字。

用户表

user_id名字姓氏

   2      John        drake         
   3       Hamer      Joy       
   4        Finter     Richy    

朋友表

friends_id user_id friend_id

   1           2          3         
   2            4         2         
   3            4         3

这是我执行的查询

SELECT a.friends_id,a.user_id, 
       a.friend_id, b.firstname, b.lastname
FROM friends AS a,users As b
WHERE (a.friend_id = b.user_id OR a.user_id = b.user_id) AND
      (a.friend_id = 2 OR a.user_id =2)

这是我得到的结果

friends_id  user_id  friend_id  firstname   lastname    
   1           2       3          John      drake       
   1           2       3          Hamer     Joy         
   3           4       2          John      drake       
   3           4       2           Finter    Richy  

这是我期待的结果

friends_id  user_id  friend_id  firstname   lastname    
   1           2       3          Hamer     Joy         
   3           4       2           Finter    Richy

也许是指定个人朋友的union以及将他作为朋友的用户:

select a.friends_id, a.user_id, a.friend_id, b.firstname, b.lastname
from friends a, users b
where a.user_id = 2 and b.user_id = a.friend_id 

union

select a.friends_id, a.user_id, a.friend_id, b.firstname, b.lastname
from friends a, users b
where a.friend_id = 2 and b.user_id = a.user_id

这是由2个内部查询的union产生的所有单个查询。

我认为您的原始查询的问题是您在联接中使用OR条件。 通常情况下,OR在连接条件下没有帮助。

这是另一个更短的解决方案,并使用ANSI连接语法,因此您可以清楚地看到投影。 免责声明,我没有在数据库中测试过,因此可能存在错误。 但是,如果您愿意,也可以访问原始用户名(我已将其添加为最后两列)。

select F.friends_id, U.user_id, FR.user_id,
    FR.firstname, FR.lastname,
    U.firstname, U.lastname
FROM users U join Friends F on
        U.user_id = F.user_id
    JOIN Users FR on
        F.friend_id = FR.user_id
where U.user_id = 2 or FR.user_id = 2
;

作为一般规则,使用ANSI连接语法可以使查询更容易阅读,并有助于确保指定所有连接条件。 它还使您可以轻松访问更多联接类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM