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

经典sql题(十一)查找共同好友或相互关注 二

在处理海量数据时,使用 JOIN 可能会导致性能瓶颈,特别是当参与 JOIN 的表非常大时,JOIN 操作通常需要扫描多个表,并且在连接条件上进行复杂的匹配,这会消耗大量的计算资源和时间。相反,使用聚合或过滤的方法可以减少数据处理的复杂性,从而提高性能。以下是使用不依赖于 JOIN 的方法找出互相关注用户对的方法

1. 问题背景

设想我们有一个名为 follow 的表,记录用户之间的关注关系。我们的目标是找出所有互相关注的用户对。比如,如果用户 A 关注了用户 B,而用户 B 也关注了用户 A,则我们可以认为这是一种双向关系。

2. 数据结构

假设我们的 follow 表结构如下:

from_userto_user
12
21
13
31
45
54
23

3. SQL 查询步骤解析

3.1 内部查询

我们首先需要通过一个内部查询生成一个唯一标识符,表示每对用户的关注关系。这个标识符将使我们能够识别出相同用户对的双向关系。

SELECTfrom_user,to_user,IF(from_user > to_user, CONCAT(from_user, '-', to_user), CONCAT(to_user, '-', from_user)) AS concat_users
FROM follow;
结果
from_userto_userconcat_users
121-2
211-2
131-3
311-3
454-5
544-5
232-3

3.2 中间结果 - 聚合双向关系

接下来,我们需要利用窗口函数来计算每个 concat_users 的出现次数,从而识别出双向关系。

SELECTfrom_user,to_user,SUM(1) OVER(PARTITION BY concat_users) AS flag
FROM(SELECTfrom_user,to_user,IF(from_user > to_user, CONCAT(from_user, '-', to_user), CONCAT(to_user, '-', from_user)) AS concat_usersFROM follow) t;
结果
from_userto_userflag
122
212
132
312
452
542
231
321

3.3 外部查询 - 筛选双向关系

最后,我们在外部查询中筛选出 flag = 2 的记录,这表明这些用户对之间存在双向关注关系。

SELECTt1.from_user,t1.to_user
FROM(SELECTfrom_user,to_user,SUM(1) OVER(PARTITION BY concat_users) AS flagFROM(SELECTfrom_user,to_user,IF(from_user > to_user, CONCAT(from_user, '-', to_user), CONCAT(to_user, '-', from_user)) AS concat_usersFROM follow) t) t1
WHEREt1.flag = 2;
最终结果
from_userto_user
12
21
45
54

根据上述查询结果,我们可以分析出每对用户之间的好友关系:

用户 1 和 用户 2 是好友。
用户 4 和 用户 5 是好友。


http://www.mrgr.cn/news/35413.html

相关文章:

  • 使用 Keras 训练一个循环神经网络(RNN)
  • java八股笔记-1-java基础
  • 显示微服务间feign调用的日志
  • 基于Spring Boot与Redis的令牌主动失效机制实现
  • Qt_day10_程序打包(完结)
  • pycharm报错:no module named cv2.cv2
  • 【大数据入门 | Hive】DDL数据定义语言(数据库DataBase)
  • Q必达任务脚本
  • asp.net core日志与异常处理小结
  • vue3开发中易遗漏的常见知识点
  • MySQL 中存储过程参数的设置与使用
  • 代码随想录Day 53|题目:110. 字符串接龙、105.有向图的完全可达性、106. 岛屿的周长
  • Linux下搭建iSCSI共享存储-Tgt
  • 【2024W36】肖恩技术周刊(第 14 期):什么是完美副业?
  • 二叉树进阶oj题【二叉树相关10道oj题的解析和代码实现】
  • 00DSP学习-F28379D学习准备(了解一个工程的构成)
  • 傅里叶变换及其应用笔记
  • JavaScript --json格式字符串和对象的转化
  • PHPStorm如何调整字体大小
  • 在Markdown中实现内部查询
  • DataWhale X 南瓜书学习笔记 task03笔记
  • Vue.js 中,@click 和 @click.stop的区别
  • C++ 线程睡眠(阻塞)
  • 游戏化在电子课程中的作用:提高参与度和学习成果
  • Ubuntu一些文件及问题研究分析
  • 解决:sudo apt install catkin的报错问题。