MySQL:根据列值

时间:2016-06-28 06:13:23

标签: mysql

我有两张表user_profilesuser_friends

user_profiles包含列iduser_privacy和其他几列(例如usernameage等)。

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为真,那么只有它应该检查它。

如何编写此查询? (最好使用连接而不使用子查询)

3 个答案:

答案 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
  1. 使用LEFT JOIN,即使user_privacy为false,查询仍会返回user_profiles
  2. ON的{​​{1}}条款中添加条件,表示如果LEFT JOIN为真,它将返回user_friends
  3. user_privacy的{​​{1}}子句中移动F.friends_id的过滤。 (感谢@Msf vtp验证,干杯!)

答案 2 :(得分:1)

使用左连接:

<Employee>