计算互相关注的SQL应该怎么写
用户好友关系是一个产品的核心数据,只允许互相关注的用户之间发消息称为强关系型产品,比如微信;反之,不互相关注也能看到动态,比如微博,就是弱关系型产品

因为微信的存在,现在基本能做大的都是社区型的,弱关系型的产品了。所以互联网公司就很容易碰到,从单向关注数据中计算是否双向关注这种需求。

假设现在有一张表,叫table_relation里面只有两个字段,from_user,to_user, 代表关注关系从from指向to,即from_user关注了to_user。

select a.from_user,a.to_user,if(b.from_user is not null, 1, 0) as is_friend
from table_relation a left join table_relation b
on a.from_user = b.to_user and a.to_user = b.from_user

这个sql可以实现需求,问题是当用户量到了亿级别,关注关系到了百亿级别,join起来的效率就会很低。

避免join的方法就是找到双向关注之间的共性,假设有两条记录(A,B)和(B,A), 它们有什么特点呢?

哈哈,答案就是都有A和B,假设按照字典顺序做一次排序,那么排序后的结果都是(A, B), (A, B)。那我们的思路就是把特征相同的数据分到一组,计算组里面的数据条数,为1则是单向关注,为2则是双向关注。这样,利用窗口函数,不用join就能得到答案了~

select a.from_user,a.to_user,if( sum(1) over (partition by feature) > 1, 1, 0) as is_friend
from
(select a.from_user,a.to_user,if(from_user > to_user, concat(to_user, from_user), concat(from_user, to_user)) as featurefrom table_relation
)a

这里没有考虑数据重复的情况,假设有两条(A,B)(A,B),那结果就错了,不过这种数据存在说明了数仓建设的失败。如果真有,那就先去重一次即可。

这里也没有考虑用户id是非string数据类型的情况,不过一般都能转成string。

最后,不一定非要排序做字符串,能计算出共同特点就行。比如用hash函数也没问题。

计算互相关注的SQL怎么写相关推荐

  1. Esper——内存计算、事件驱动、SQL支持

    教程简介Esper是一个事件流处理(ESP)和事件关联引擎(CEP的,复杂事件处理).Esper的目标是针对实时事件驱动架构(EDA).当Esper监测到事件流中又符合条件的时间发生时,即可触发Pla ...

  2. php多条件检索怎么写,sql查询同时满足三个条件 php查询数据库,同时满足三个条件的sql怎么写?...

    php查询数据库,同时满足三个条件的sql怎么写? 这样写没有问题的,是不是你传参数错了,输出语句看看$sql="SELECT*FROM表名字WHERE字段1=aand字段2=b" ...

  3. php mysql 注入一句话木马_渗透技术--SQL注入写一句话木马原理

    讲一下SQL注入中写一句话拿webshell的原理,主要使用的是 SELECT ... INTO OUTFILE 这个语句,下面是一个语句的例子: SELECT * INTO OUTFILE 'C:\ ...

  4. mysql 查询top N (解释sql思路和语法),分组查询排序前n行 的sql怎么写

    遇到这个问题,我也不会,然后我就上网搜,发现篇篇都是复制的啊,太没意思了. 我坚持原创.拒绝天下统一互抄! 而且我会把解题思路告诉你们,以后再遇到类似问题,就懂了 我的文章就算是mysql小白也能够一 ...

  5. 关于PL/SQL我写了一份从0到1的入门教程

    PL/SQL 什么是PL/SQL ​ 许多时候我们会利用结构化查询语言(SQL)来访问和操作关系型数据库.这种语言的特点就是非过程化.也就是说使用的时候不用指明执行的具体方法和途径,即不用关注任何的实 ...

  6. mysql 索引巧用,SQL语句写得忒野了

    今天来分享几个MySQL常见的SQL错误**(不当)用法.我们在作为一个初学者时,很有可能自己在写SQL时也没有注意到这些问题,导致写出来的SQL语句效率低下,所以我们也可以自省自检一下. 1. LI ...

  7. sql exists用法_新同事不讲武德,这SQL语句写得忒野了

    来源 | developer.aliyun.com/article/72501今天来分享几个MySQL常见的SQL错误(不当)用法.我们在作为一个初学者时,很有可能自己在写SQL时也没有注意到这些问题 ...

  8. azure不支持哪些语句 sql_新同事不讲武德,这SQL语句写得忒野了

    前言 MySQL在去年年仍然保持强劲的数据库流行度增长趋势.越来越多的客户将自己的应用建立在MySQL数据库之上,甚至是从Oracle迁移到MySQL上来.但也存在部分客户在使用MySQL数据库的过程 ...

  9. 多懂点SQL可以写出更好的接口

    引子: 今天被人说我MySQL懂得很浅,作为一个老OCP,我竞然无言以对.因为确实我这么 多年一直都用的ORACLE,没玩过啥重量级的MySQL应用.  不过,这个刚好让我想起了前几天, 一个API接 ...

  10. 1468. 计算税后工资(SQL)

    题目:https://leetcode-cn.com/problems/calculate-salaries/ Salaries 表: +---------------+---------+ | Co ...

最新文章

  1. Intelij IDEA 2016.3安装mybatis插件并激活教程
  2. KVM配置之(3)- 克隆
  3. WIN32 Inline HOOK
  4. 《Java和Android开发实战详解》——2.2节构建Java应用程序
  5. python程序启动其他python程序,如何使用Python启动应用程序的实例?
  6. Cookie、Session和Storage
  7. 数据统一管理--企业决策分析之刚需
  8. 计算机安装了更新ie版本,win7重做后,发觉IE浏览器版本低,怎么办?今天教大家重装系统后,升级IE浏览器-win7版本...
  9. 基于java的房屋销售管理系统设计(含源文件)
  10. arcgis制作土地利用转移矩阵
  11. 推荐一份Web 工程师的前端书单
  12. 彻底删除vmware
  13. [深入理解Android卷一全文-第六章]深入理解Binder
  14. 4种JavaScript中获取HTML元素的方式
  15. Robotium 介绍
  16. redirect、redirect-action、chain三者的区别!
  17. 安装Matlab R2022a/64位
  18. 矩阵与坐标系的映射关系
  19. Latex图片、公式、参考文献插入技巧
  20. 算法概述——四大算法总结

热门文章

  1. Oh my God,甲骨文oracle 准备收购 Sun 了.
  2. Knockout.Js案例三单页面应用程序
  3. 标记肽Suc-GGF-pNA,68982-90-1
  4. 大一C语言程序设计练习题(四)
  5. 理想ONE“偷袭”豪华品牌 李想强调不会收取金融服务费 | 2019上海车展...
  6. python使用requests爬取DOTA2轮盘数据
  7. java中审核订单流程图_订单评审管理过程流程图
  8. java开发 五大基于jvm的脚本语言_基于JVM的五大脚本语言
  9. 疾病负担研究(GBD)-如何优雅的展示发病率数据
  10. python猫咪藏在哪个房间_操作了一把Python,我能叫出所有猫的名字!