微博中的用户关系需要使用有向图(Directed Graph)表示。

因为关注是单向关联,A关注了B,但是B不一定关注A。下图是一个简单的粉丝关系示意图:

如果A关注了B,就会存在一条从A到B的带箭头的边。上图中的“刘一”关注了“周八”,同时“刘一”和“李四”相互关注。

对于有向图而言,度又分为入度(In-degree)和出度(Out-degree)。入度表示有多少条边指向该顶点,出度表示有多少条边是以该顶点为起点的。“刘一”的入度为4(微博的粉丝数),出度为2(微博关注的人数)。

对于社交网络关系中的图数据而言,一般使用邻接列表(Adjacency List)进行存储。例如,上面的粉丝关系可以使用下图所示的邻接列表进行描述。

每个顶点都有一个记录着与它相关的顶点列表。“刘一”关注了“李四”和“周八”,上图显示了一个关注列表。我们也可以创建一个逆向的邻接列表,用于存储用户的粉丝。

对于好友关系这种无向图,每条边都是双向的关注关系,可以使用两个邻接列表进行存储。

具体到数据库中的表而言,我们可以为顶点创建一个表,为顶点之间的边创建一个表,从而实现邻接表模型。

t_fans表中存储了用户的粉丝,例如:

其中,user_id是用户编号,fans_id是该用户的粉丝编号。

t_followed表中存储了用户关注的人,例如:

其中,user_id是用户编号,followed_id是该用户关注的其他用户。

粉丝关系分析

1.我的关注

查询刘一关注的人

实现SQL:

SELECT u.user_name AS "我的关注" FROM
t_followed f
JOIN t_user u ON u.user_id=f.followed_id
WHERE f.user_id = (SELECT user_id FROM t_user WHERE user_name = '刘一');

执行结果:

“刘一”关注了“李四”和“周八”。

2.共同关注

查询和“刘一”关注了相同用户的其他用户

实现SQL:

WITH cf(user1,user2,followed) AS (SELECT d.user_id,r.fans_id,r.user_id FROM t_followed dJOIN t_fans rON r.user_id=d.followed_id AND r.fans_id != d.user_idWHERE d.user_id = (SELECT user_id FROM t_user WHERE user_name = '刘一')
)SELECT u1.user_name "用户1",u2.user_name "用户2",u3.user_name "共同关注"
FROM cf
JOIN t_user u1 ON u1.user_id=cf.user1
JOIN t_user u2 ON u2.user_id=cf.user2
JOIN t_user u3 ON u3.user_id=cf.followed

执行结果:

“刘一”和“孙七”共同关注了“周八”。

其中,cf代表了和“刘一”拥有共同关注用户的其他用户。

主查询通过多个连接语句返回了这些用户的姓名。

3.我的粉丝

查询“刘一”的粉丝

实现SQL:

SELECT u.user_name AS "我的粉丝" FROM
t_fans f
JOIN t_user u ON u.user_id=f.fans_id
WHERE f.user_id = (SELECT user_id FROM t_user WHERE user_name = '刘一')

执行结果:

“刘一”拥有4个粉丝。

4.互为粉丝

查询哪些用户之间互相关注

实现SQL:

WITH df(user1,user2) AS (SELECT r.user_id,r.fans_idFROM t_fans rJOIN t_followed d ON r.user_id=d.user_id AND r.fans_id=d.followed_id AND r.user_id < r.fans_id
)SELECT u1.user_name AS "用户一",u2.user_name AS "用户二"
FROM  df
JOIN t_user u1 ON u1.user_id=df.user1
JOIN t_user u2 ON u2.user_id=df.user2

执行结果:

“刘一”和“李四”互为粉丝,而“孙七”和“周八”则互相关注。

其中,df代表了相互关注的两个用户。

主查询通过连接语句返回了这些用户的姓名。

示例表和脚本:

-- 创建用户表t_user
CREATE TABLE t_user(user_id   INTEGER PRIMARY KEY,user_name VARCHAR(50) NOT NULL
);INSERT INTO t_user VALUES(1, '刘一');
INSERT INTO t_user VALUES(2, '陈二');
INSERT INTO t_user VALUES(3, '张三');
INSERT INTO t_user VALUES(4, '李四');
INSERT INTO t_user VALUES(5, '王五');
INSERT INTO t_user VALUES(6, '赵六');
INSERT INTO t_user VALUES(7, '孙七');
INSERT INTO t_user VALUES(8, '周八');
INSERT INTO t_user VALUES(9, '吴九');-- 创建粉丝表t_fans
CREATE TABLE t_fans(user_id     INTEGER NOT NULL, fans_id INTEGER NOT NULL, PRIMARY KEY (user_id, fans_id)
);INSERT INTO t_fans VALUES(1, 2);
INSERT INTO t_fans VALUES(1, 3);
INSERT INTO t_fans VALUES(1, 4);
INSERT INTO t_fans VALUES(1, 7);
INSERT INTO t_fans VALUES(2, 3);
INSERT INTO t_fans VALUES(3, 4);
INSERT INTO t_fans VALUES(4, 1);
INSERT INTO t_fans VALUES(5, 2);
INSERT INTO t_fans VALUES(5, 8);
INSERT INTO t_fans VALUES(6, 4);
INSERT INTO t_fans VALUES(7, 8);
INSERT INTO t_fans VALUES(8, 1);
INSERT INTO t_fans VALUES(8, 7);-- 创建关注表t_followed
CREATE TABLE t_followed(user_id     INTEGER NOT NULL, followed_id INTEGER NOT NULL, PRIMARY KEY (user_id, followed_id)
);INSERT INTO t_followed VALUES(1, 4);
INSERT INTO t_followed VALUES(1, 8);
INSERT INTO t_followed VALUES(2, 1);
INSERT INTO t_followed VALUES(2, 5);
INSERT INTO t_followed VALUES(3, 1);
INSERT INTO t_followed VALUES(3, 2);
INSERT INTO t_followed VALUES(4, 1);
INSERT INTO t_followed VALUES(4, 3);
INSERT INTO t_followed VALUES(4, 6);
INSERT INTO t_followed VALUES(7, 1);
INSERT INTO t_followed VALUES(7, 8);
INSERT INTO t_followed VALUES(8, 5);
INSERT INTO t_followed VALUES(8, 7);

SQL案例学习-微博好友关系相关推荐

  1. SQL案例学习-微信好友关系

    在微信中,两个用户可以相互加为好友. 用两个数据表来存储相关数据,t_user表和t_friend表. 这里需要注意的是两个用户成为好友后,在t_friend表中会有两条记录,以user_id为1和2 ...

  2. css案例学习之继承关系

    代码 <html> <head><title>继承关系</title><style> body{color:blue; /* 颜色 */te ...

  3. SQL案例学习-数据透视表

    销售表数据: 通过SQL查询实现如下数据透视表: 实现SQL: SELECT COALESCE(product,'合计值') AS 产品名称, COALESCE(channel,'合计值') AS 渠 ...

  4. 用GEPHI绘制的 我的微博 好友 关系 与 好友的好友关系图

    下图中:点表示一个用户. 我关注的用户 会有 一条 由我指向 到该点的边.最中心的点是我自己. 同样,我好友的好友即为  好友->好友的好友的边. 下边两幅图 均为由 gephi所绘制,我共关注 ...

  5. SQL案例学习-保护个人信息

    姓名.身份证号以及银行卡号等属于个人敏感信息.为了保护个人隐私,我们在前端界面显示时可能需要将这些信息中的部分内容进行隐藏,也就是显示为星号(*). 以医院排队叫号系统为例,屏幕上通常会隐藏患者的姓氏 ...

  6. SQL案例学习-月度销售冠军

    公司销售人员负责各种产品的销售,emp_sales表中记录了每个销售人员每个月的销售数据, emp_sales表中的字段分别表示员工编号.销售年份.销售月份以及销售金额. 查询每个月的销售冠军 实现S ...

  7. 基于Redis的微博计算好友关系

    基于Redis的微博计算好友关系 一.计算好友关系业务场景分析 微博微关系: 共同关注:是计算出阿甘和雷军共同关注的人有哪些? 我关注的人也关注他:是计算出我阿甘关注的人群中,有哪些人同时和我一样关注 ...

  8. html并集选择器怎么写,css案例学习之并集选择器

    代码 并集选择器 h1, h2, h3, h4, h5, p{ /*并集选择器*/ color:purple; /* 文字颜色 */ font-size:15px; /* 字体大小 */ } h2.s ...

  9. 算法高级(37)-微信、微博中的好友关系该如何设计?

    一.引言 大家都用过各种各样的社交软件,像国人用的最多的就是QQ.微信.微博等,国外用的多的就是推特.脸书等,这些社交软件都是建立在人与人相互之间关系的基础上. 做过类似项目的同学,应该知道此类项目中 ...

最新文章

  1. 全面升级!星环科技基础软件再升级,赋能数字中国建设
  2. 【Zookeeper】源码分析之Leader选举(一)
  3. (thinkphp、jQuery)ajax返回json数据
  4. android替换电话应用,android – 替换调用应用程序
  5. android 官方教程中文版
  6. SpingBoot+Mybaits+Vue,更新学习
  7. C++ const关键字总结
  8. Spring 实战-第一章-基本概念
  9. Spring Boot自动配置与Spring 条件化配置
  10. 北师大计算机组成原理答案,计算机组成原理(白中英)本科生试题库整理附答案[共21页].doc...
  11. Android优化系列之ListView优化老生常谈
  12. CNN vs RNN vs ANN——3 种神经网络分析模型,你 Pick 谁?
  13. C++ 模板实例化与调用
  14. Python入门--python中的global
  15. 录音转文字 android,录音转文字pro
  16. java从入门到放弃教程(一) 想转行的看过来
  17. Elasticsearch对接Django
  18. 2014年第五届蓝桥杯C/C++程序设计本科B组省赛 史丰收速算(代码填空)
  19. 卸载系统的dhcp服务器,dhcp服务器释放ip地址
  20. 纷享销客订货通:B2B渠道管理专属的经销商订货平台

热门文章

  1. Nginx 配置支持PHP
  2. c++自定义sort()函数的排序方法
  3. vlunhub系列之CH4INRULZ
  4. 转】PPT带备注演示(只有讲解者看到备注)[转载]
  5. 一个JavaSE的金牌榜小项目,启蒙+提高【重点:Tomcat 8.5 +mysql 5.7+jdk1.8】
  6. 实验十四:Wireshark数据抓包分析之ARP协议
  7. C++ 全局变量及静态全局变量的使用方法
  8. C# AppDomain获取所有程序集的方法
  9. 利用python从GitHub获取https代理,采集网站的数据的速度翻倍
  10. Day758.Redis主从同步与故障切换的坑 -Redis 核心技术与实战