请我一直试图获取一个查询以返回用户拥有的朋友,在我的会员表中,我有该会员的用户ID,名字和姓氏,在Friends表中有用户ID列和朋友ID列,现在我将我的members表与friends表结合在一起,这样我就可以得到朋友的名字。
用户表
user_id名姓
2 John drake
3 Hamer Joy
4 Finter Richy
朋友桌
friends_id user_id朋友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
答案 0 :(得分:0)
可能会选择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
个产生的单个查询。
答案 1 :(得分:0)
我认为您原始查询的问题在于您在联接中使用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连接语法可以使查询更易于阅读,并有助于确保指定所有连接条件。它还使您可以轻松访问更多联接类型。