sql面试题之“互相关注的人”(方法三)

news2024/9/27 7:25:07

题目:某社交平台有关注这个功能,关注的同时也会被关注。现有需求需要找出平台上哪些用户之间互相关注。

文章目录

  • 题目如下:
  • 一、数据准备
  • 二、建表并导入数据
    • 1.建表
    • 2.导入数据
    • 3.数据分析和实现思路
    • 小结:


题目如下:

某社交平台后端有user_relation 这张表,表里有字段 from_side 和 to_side。如何把相互关注那些人查出来呢?以下方法是第三种方法。
如果想了解前两种方法如下:
sql面试题之“互相关注的人”(方法一)
sql面试题之“互相关注的人”(方法二)


以下数据部分同前两种方法的数据一致,看过的小伙伴可以直接看实现部分。

一、数据准备

数据:我们以火影中的动漫角色为例,首先准备数据。

二、建表并导入数据

1.建表

假设 dms.follow_each_others用来存放数据,如下(示例):

create table dms.follow_each_others
(
from_side  STRING
,to_side   STRING
)

2.导入数据

建表语句如下(此语法为hive语法,当为impala语法时,overwrite后面的table可以省略):

insert overwrite table dms.follow_each_others values
('宇智波带土','漩涡鸣人')
,('宇智波带土','波风水门')
,('波风水门','宇智波带土')
,('宇智波佐助','宇智波带土')
,('漩涡鸣人','日向雏田')
,('日向雏田','漩涡鸣人');

3.数据分析和实现思路

第三种通过我们特别熟悉的join 方式来实现。满足互相关注的人,有此条数据,from_side -->to_side
,那么一定会有 to_side -->from_side ,所以通过自关联很容易实现。如下:

--通过 inner join 实现
select A1.from_side
       ,A1.to_side
       ,A2.from_side
       ,A2.to_side
       from dms.follow_each_others A1 
  inner join dms.follow_each_others A2
         on A1.from_side = A2.to_side
        AND A1.to_side  = A2.from_side
  where A2.from_side is not null  

--通过left join 实现
select A1.from_side
       ,A1.to_side
       ,A2.from_side
       ,A2.to_side
       from dms.follow_each_others A1 
  left join dms.follow_each_others A2
         on A1.from_side = A2.to_side
        AND A1.to_side  = A2.from_side
  where A2.from_side is not null  

实现结果:
请添加图片描述

小结:

在数据量比较大时,三种方法的优先级:方法二>>方法三>方法一。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1284548.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[RK-Linux] 移植Linux-5.10到RK3399(三)| 检查eMMC与SD卡配置

这个专题主要记录把 RK Linux-5.10 移植到 ROC-RK3399-PC Pro 的过程。 文章目录 一、eMMC二、SD 卡三、两个接口的区别一、eMMC RK3399 的 eMMC 接口如图: datasheet 介绍: 实际上,连接 eMMC 存储器用的是 SDHCI 接口。SDHCI(Secure Digital Host Controller Interface)…

【数据结构】最短路径——Floyd算法

一.问题描述 给定带权有向图G(V,E),对任意顶点 V (ij),求顶点到顶点的最短路径。 转化为: 多源点最短路径求解问题 解决方案一: 每次以一个顶点为源点调用Dijksra算法。时间复杂…

香港虚拟信用卡如何办理,支持香港apple id

什么是虚拟信用卡? 虚拟信用卡,英文称之为Virtual Credit Card Numbers,就是指没有实体卡片,是基于银行卡上面的BIN码所生成的虚拟账号。通常用于进行网络交易,使用起来很方便,也很安全。 它与实体信用卡…

算法-01-递归

1-理解递归 斐波那契数列(Fibonacci sequence),又称黄金分割数列 ,以兔子繁殖为例子而引入,故又称“兔子数列”,其数值为:1、1、2、3、5、8、13、21、34……特点是 从第三个数开始,第…

HOST文件被挟持,无法上网,如何解决。

问题: 晚上开机,突然发现无法联网,提示网络异常 解决: 首先网络诊断,host文件被劫持,修复后,仍然不行。 然后测试手机热点,发现仍然无法联网 尝试用火绒修复,无果。 所有…

Linux Camera Driver(2):CIS设备注册(DTS)

一:MIPI接口 1、硬件接口 MIPI接口以rv1109和gc2053的硬件为例进行说明: 2、ISP驱动 注意配置事项: endpoint配置,必须指定data-lanes,否则无法识别为mipi类型 链接方式:sensor->csi_dphy->isp->ispp (1)sensor节点配置 根据原理图可知:mipicsi_clk0即引…

Linux系统安装Python3环境

1、默认情况下,Linux会自带安装Python,可以运行python --version命令查看,如图: 我们看到Linux中已经自带了Python2.7.5。再次运行python命令后就可以使用python命令窗口了(CtrlD退出python命令窗口)。 2…

STM32F407-14.3.11-01互补输出和死区插入

互补输出和死区插入 高级控制定时器(TIM1 和 TIM8)可以输出两路互补信号,并管理输出的关断与接通瞬间。 这段时间通常称为死区,用户必须根据与输出相连接的器件及其特性(电平转换器的固有延迟、开关器件产生的延迟...&…

MySQL之时间戳(DateTime和TimeStamp)

MySQL之时间戳(DateTime和TimeStamp) 文章目录: MySQL之时间戳(DateTime和TimeStamp)一、DateTime类型二、TimeStamp类型三、DateTime和TimeStamp的区别 当插入数据时,需要自动记录一个时间时候&#xff0c…

llama.cpp部署(windows)

一、下载源码和模型 下载源码和模型 # 下载源码 git clone https://github.com/ggerganov/llama.cpp.git# 下载llama-7b模型 git clone https://www.modelscope.cn/skyline2006/llama-7b.git查看cmake版本: D:\pyworkspace\llama_cpp\llama.cpp\build>cmake --…

git 本地改动无法删除

1. 问题 记录下git遇到奇怪的问题,本地有些改动不知道什么原因无法删除 git stash, git reset --hard HEAD 等都无法生效,最终通过强制拉取线上解决 如下图: 2. 解决 git fetch --all git reset --hard origin/master执行这两…

LeedCode刷题---双指针问题

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂,年薪百万! 双指针简介 常见的双指针有两种形式,一种是对撞指针,一种是左右指针。 对撞指针:一般用于顺序结构中&…

马斯克极简5步工作法 —— 筑梦之路

马斯克的五步流程法则: 第一步:确定需求 第二步:极力删除零件或过程 第三步:简化和优化 第四步:加快周期时间 第五步:自动化特别注意:完成前三步之前,千万不要考虑加速和自动化&…

JVM类加载全过程

Java虚拟机类加载的全过程,即加载,验证,准备,解析,初始化 一、加载 加载 是 类加载过程中的一个阶段, 有以下三部分组成 1)通过一个类的全限定名来获取定义此类的二进制流 2)将这…

跨域问题的解决办法

1、产生跨域问题样式 前台写完,直接访问后台接口,会产生跨域的问题,需要配置文件去解决这个问题 从源http://localhost:8080访问http://localhost:8088/books的XMLHttpRequest已被CORS策略阻止:请求的资源上没有Access- control - allow - o…

C++学习之路(十八)C++ 用Qt5实现一个工具箱(点击按钮以新窗口打开功能面板)- 示例代码拆分讲解

上篇文章,我们用 Qt5 实现了在小工具箱中添加了《增加托盘图标并且增加显示和退出菜单》功能。今天我们把按钮打开功能的方式改一改,让点击按钮以新窗口打开功能面板。下面我们就来看看如何来规划开发这样的小功能并且添加到我们的工具箱中吧。 老规矩&…

个人博客搭建保姆级教程-HTML页面编写篇

选择模板 首先我们要选一个好的模板,然后对模板进行剪裁。我的模板是在站长之家进行下载的 素材下载-分享综合设计素材免费下载的平台-站长素材 我选的模板的具体地址是 个人博客资讯网页模板 这里需要我们学习一下在前边一篇文章里提到的HTML、JavaScript、CSS…

量化交易全流程(八)

本节目录 随机森林 支持向量机 朴素贝叶斯 神经网络构建 将机器算法融入量化投资领域,不同于一般的量化交易策略,从一类数据中自动分析获得规律,利用规律对未知数据进行预测的算法。 决策树:决策树具有分层或者树状结构&…

【已验证】SqlBulkCopy 执行批量插入的时候报超时问题-解决办法

把datatable里面的数据插入到数据库,但是数据量大的情况下批量插入会提示超时,所以把datatable的数据分批写入数据库的 using (SqlConnection connection new SqlConnection(ConnectionString)){connection.Open();int pageSize 100000;//SqlBulkCopy大…

C++基础 -39- 阶段练习 编写通用数组

功能要求 -1- 使用尾插法和尾删法对数组中的数据修改 -2- 构造函数传入数组的大小和容量 -3- 可以通过下标的方式访问数组的中的元素 -4- 可以获取数组中的元素个数和数组的容量 #include <iostream> using namespace std; template<class T> class MyArray {publi…