SQL面试题挑战06:互相关注的人
问题
现在有一张relation表,里面只有两个字段:from_user和to_user,代表关注关系从from指向to,即from_user关注了to_user。现在要找出互相关注的所有人。
from_user to_user
乔峰 段誉
乔峰 虚竹
虚竹 乔峰
徐风年 徐骁
徐骁 徐风年
建表语句
drop table if exists follow;
create table follow(
from_user varchar(20),
to_user varchar(20)
);
insert into follow values
('乔峰', '段誉'),
('乔峰', '虚竹'),
('虚竹', '乔峰'),
('徐风','徐骁'),
('徐骁', '徐风年')
解答
解法1:自连接
思路:直接按条件自连接即可。
select
f1.from_user id1,
f1.to_user id2
from
follow f1
inner join follow f2 on f1.to_user=f2.from_user and f1.from_user=f2.to_user;
解法2:找规律
思路:将from_user和to_user字段拼接,拼接时注意,字典序小的在前,这样相互关注人拼接后的结果是一样。因此我们可以通过拼接后的字段group by,然后过滤出条数为2条的字段,最后拆分拼接字段即可
select
substring_index(friend_ship,',',1) user1,
substring_index(friend_ship,',',-1) user2
from
(
select
if(from_user > to_user, concat(from_user, ',', to_user), concat(to_user, ',', from_user)) friend_ship
from
follow
group by
friend_ship
having
count(*) = 2
)t0