SQL面试题挑战06:互相关注的人

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
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值