当前位置: 首页 > news >正文

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

目录

  • 问题:
  • SQL解答:

问题:

现在有一张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
;

相关文章:

  • 【飞凌 OK113i-C 全志T113-i开发板】一些有用的常用的命令测试
  • react 路由v6
  • Django之DRF框架三,序列化组件
  • DshanMCU-R128s2术语表
  • 【微服务】springboot整合kafka-stream使用详解
  • 【前端基础】uniapp、axios 获取二进制图片
  • k8s学习 — 各知识点快捷入口
  • 堆与二叉树(下)
  • YOLOv8改进 | 主干篇 | 利用SENetV2改进网络结构 (全网首发改进)
  • ModuleNotFoundError: No module named ‘tensorflow‘
  • electron GPU process isn‘t usable. Goodbye
  • jvm对象探究
  • 【YOLOV8预测篇】使用Ultralytics YOLO进行检测、分割、姿态估计和分类实践
  • Android画布Canvas裁剪clipRect,Kotlin
  • 华为云Stack 8.X 流量模型分析(二)
  • 听GPT 讲Rust源代码--src/tools(22)
  • 自动生成数控加工的轨迹刀具轨迹阿基米德螺旋线(3D)
  • Codeforces Round 916 (Div. 3)(E:贪心 F贪心dfs G tarjan+topsort +线段树优化建图)
  • 实现 Trie (前缀树)
  • Go自定义PriorityQueue优先队列使用Heap堆
  • 商务部再回应中美经贸高层会谈
  • 《2025城市青年旅行消费报告》发布,解码青年出行特征
  • 泉州一家婚介机构广告牌越南新娘七天闪婚领证?市监部门介入
  • 司法部谈民营经济促进法:对违规异地执法问题作出禁止性规定
  • 全国首例在沪完成,这项近视治疗手术不到10秒
  • 国铁集团:铁路五一假期运输收官,多项运输指标创历史新高