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

问题:

现在有一张relation表,里面只有两个字段:from_user和to_user,代表关注关系从from指向to,即from_user关注了to_user。现在要找出互相关注的所有人。


from_user    to_user
孙悟空          唐僧
唐僧            如来佛祖
唐僧            观音菩萨
观音菩萨         如来佛祖
唐僧            孙悟空
孙悟空          玉皇大帝
玉皇大帝        如来佛祖
如来佛祖         观音菩萨
如来佛祖         玉皇大帝
如来佛祖         唐僧
孙悟空          猪八戒
猪八戒            嫦娥
猪八戒           孙悟空
猪八戒           唐僧
猪八戒          沙僧
沙僧            猪八戒
沙僧            玉皇大帝
沙僧            孙悟空
沙僧            唐僧

SQL解答:

解答思路一:使用自关联即可,这种方式简单也最易理解。适合数据量不是很大的情况,因为会导致数据膨胀。


with tmp as
(
select '孙悟空' as from_user ,     '唐僧'   as to_user
union all
select '唐僧' as from_user ,     '如来佛祖'   as to_user
union all
select '唐僧' as from_user ,     '观音菩萨'   as to_user
union all
select '观音菩萨' as from_user ,     '如来佛祖'   as to_user
union all
select '唐僧' as from_user ,     '孙悟空'   as to_user
union all
select '孙悟空' as from_user ,     '玉皇大帝'   as to_user
union all
select '玉皇大帝' as from_user ,     '如来佛祖'   as to_user
union all
select '如来佛祖' as from_user ,     '观音菩萨'   as to_user
union all
select '如来佛祖' as from_user ,     '玉皇大帝'   as to_user
union all
select '如来佛祖' as from_user ,     '唐僧'   as to_user
union all
select '孙悟空' as from_user ,     '猪八戒   as to_user
union all
select '猪八戒' as from_user ,     '嫦娥'   as to_user
union all
select '猪八戒' as from_user ,     '孙悟空'   as to_user
union all
select '猪八戒' as from_user ,     '唐僧'   as to_user
union all
select '猪八戒' as from_user ,     '沙僧'   as to_user
union all
select '沙僧' as from_user ,     '猪八戒'   as to_user
union all
select '沙僧' as from_user ,     '玉皇大帝'   as to_user
union all
select '沙僧' as from_user ,     '孙悟空'   as to_user
union all
select '沙僧' as from_user ,     '唐僧'   as to_user
)
select
a.from_user,
a.to_user,
if(b.from_user is not null, 1, 0) as is_friend -- 1:互相关注 
from tmp a
left join tmp b
on a.from_user=b.to_user and a.to_user=b.from_user
;

解答思路二:找到互相关注的人的规律,当他们是互相关注时,那么将from_user和to_user其中一个顺序调换位置后,from_user和to_user就一定会出现两条数据(源表提前已经去重),所有出现两条数据的人就是有互相关注的。这种方式不会导致数据膨胀。

with tmp as
(
    select '孙悟空' as from_user ,     '唐僧'   as to_user
union all
select '唐僧' as from_user ,     '如来佛祖'   as to_user
union all
select '唐僧' as from_user ,     '观音菩萨'   as to_user
union all
select '观音菩萨' as from_user ,     '如来佛祖'   as to_user
union all
select '唐僧' as from_user ,     '孙悟空'   as to_user
union all
select '孙悟空' as from_user ,     '玉皇大帝'   as to_user
union all
select '玉皇大帝' as from_user ,     '如来佛祖'   as to_user
union all
select '如来佛祖' as from_user ,     '观音菩萨'   as to_user
union all
select '如来佛祖' as from_user ,     '玉皇大帝'   as to_user
union all
select '如来佛祖' as from_user ,     '唐僧'   as to_user
union all
select '孙悟空' as from_user ,     '猪八戒   as to_user
union all
select '猪八戒' as from_user ,     '嫦娥'   as to_user
union all
select '猪八戒' as from_user ,     '孙悟空'   as to_user
union all
select '猪八戒' as from_user ,     '唐僧'   as to_user
union all
select '猪八戒' as from_user ,     '沙僧'   as to_user
union all
select '沙僧' as from_user ,     '猪八戒'   as to_user
union all
select '沙僧' as from_user ,     '玉皇大帝'   as to_user
union all
select '沙僧' as from_user ,     '孙悟空'   as to_user
union all
select '沙僧' as from_user ,     '唐僧'   as to_user
)
select
from_user
,to_user
,count(1) over(partition by feature) as is_friend ---1:不是 2:是
from
(
    select
    from_user
    ,to_user
    --当有互相关注时,保证只将其中的一对用户调换from_user和to_user并拼接
    ,if(from_user>to_user,concat(from_user,to_user),concat(to_user,from_user)) as feature
    from tmp
)t1
;

相关推荐

  1. SQL面试挑战06互相关注

    2023-12-25 05:56:06       51 阅读
  2. SQL面试挑战03:奖金瓜分问题(拼多多)

    2023-12-25 05:56:06       57 阅读
  3. SQL面试挑战04:找出使用相同ip用户

    2023-12-25 05:56:06       62 阅读
  4. SQL面试挑战08:补全缺失日月销售累计

    2023-12-25 05:56:06       61 阅读
  5. SQL面试挑战14:每年在校人数

    2023-12-25 05:56:06       59 阅读
  6. SQL面试挑战13:分组topN

    2023-12-25 05:56:06       65 阅读
  7. SQL面试挑战02:同时最大在线人数问题

    2023-12-25 05:56:06       63 阅读
  8. SQL面试挑战15:sql实现分钟级趋势图

    2023-12-25 05:56:06       54 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-25 05:56:06       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-25 05:56:06       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-25 05:56:06       82 阅读
  4. Python语言-面向对象

    2023-12-25 05:56:06       91 阅读

热门阅读

  1. 客户需求分析常用的ChatGPT通用提示词模板

    2023-12-25 05:56:06       62 阅读
  2. C++多线程学习笔记004简单的Producer和Consumer模型

    2023-12-25 05:56:06       54 阅读
  3. Ubuntu18.04安装GTSAM库(亲测可用)

    2023-12-25 05:56:06       60 阅读
  4. OV5640:寄存器 自用

    2023-12-25 05:56:06       54 阅读
  5. KPM算法快速检索文本

    2023-12-25 05:56:06       52 阅读
  6. LeetCode day30

    2023-12-25 05:56:06       71 阅读
  7. 常用算法-桶排序

    2023-12-25 05:56:06       52 阅读
  8. git使用

    git使用

    2023-12-25 05:56:06      61 阅读
  9. vue和react的区别是什么

    2023-12-25 05:56:06       62 阅读