我有两张表user_profiles
和user_friends
。
user_profiles
包含列id
,user_privacy
和其他几列(例如username
,age
等)。
user_friends
包含user_id
列和friends_id
列。一个user_id
可以有多个friend_id
s
此查询只返回具有id的用户的配置文件,例如,1997:
select * from user_profiles
where prfls.id=1997;
此查询仅在有朋友ID的情况下返回具有id 1997的用户的个人资料,比如2001:
select * from user_profiles prfls
inner join user_friends frnds on (prfls.id=frnds.user_id)
where prfls.id=1997 and frnds.friends_id=2001;
但是,我想写一个单个查询,它会检查用户1997的列user_privacy
(在user_profiles
中)是否为false然后查询不应该是检查friends_id
中的user_friends
。它应该只返回用户1997的配置文件。但如果user_privacy
为真,那么只有它应该检查它。
如何编写此查询? (最好使用连接而不使用子查询)
答案 0 :(得分:1)
试试这个;)
select t1.*
from user_profiles t1
where t1.id = 1997
and (
t1.user_privacy = 'false'
or exists (select 1 from user_friends t2 where t1.id = t2.user_id and t2.friends_id = 2001)
)
没有子查询,你可以试试这个;)
select distinct t1.*
from user_profiles t1
inner join user_friends t2
on t1.id = 1997 and (t1.user_privacy = 'false' or (t1.id = t2.user_id and t2.friends_id = 2001))
答案 1 :(得分:1)
SELECT *
FROM user_profiles P
LEFT JOIN user_friends F ON F.user_id = P.id
AND P.user_privacy = true
AND F.friends_id = 2001
WHERE P.id = 1997
LEFT JOIN
,即使user_privacy
为false,查询仍会返回user_profiles
ON
的{{1}}条款中添加条件,表示如果LEFT JOIN
为真,它将返回user_friends
。user_privacy
的{{1}}子句中移动F.friends_id
的过滤。 (感谢@Msf vtp验证,干杯!)答案 2 :(得分:1)
使用左连接:
<Employee>