sns好友算法

最近研究sns的好友系统,才慢慢理解了六度分割中的度的概念,比如:我跟你是好友,咱们之间的度就是1,你的好友呢,也就是我的好友的好友,那我们之间的度就是2,相当于隔了多少层。
比如我有个好友表:(以双向好友表为例)

user_id friend_id
1 2
1 3
2 1
2 3
3 1
3 2
3 4

如果我的id是1 那么我的好友就是2,3 也就是
select friend_id from xxx where user_id=1

这句话就是查看我的直接好友,也就是一度好友
那么查看二度好友呢 就在循环遍历一遍 也就是查找我的好友的好友
而好友关系是这样 A->B->C C是A的二度好友
也就是
select friend_id from xxx where user_id in (select friend_id from xxx where user_id=1)

这是id为1的二度好友 可是如果A->C 那个C与A认识 ABC互相认识,C既可以是A的一度好友也可以是A的二度好友,这时就看要求了,如果要是只查二度好友,就可以用上面的句子,如果要是想看不认识的二度好友,就像人人网的好友推荐那样,还要在上面的结果中把A的好友去除,也就是
select friend_id from xxx where user_id in (select friend_id from xxx where user_id=1) and friend_id not in(select friend_id from xxx where user_id=1)

[color=red]括号内为一度好友查询[/color]
恩 这样就是不认识的二度好友了
看到这里大家也应该明白了 二度好友就是在一度好友的情况下 在遍历一遍 如果每个人的好友有n个 那么你的二度好友就是n*n个
现实世界中假设你的好友有100个 肯定比这个多 那么二度好友就是10000个(先不排除认识二度好友) 那么6度好友就是100^6 1万亿 地球上才几十亿 也就是这个道理
废话不说 继续跟着上述的SQL 根据sql出的结果是二度好友数 可是还有情况是好友是自己 也就是循环一圈回来了- -! 因为是双向好友表嘛 需要在结果中把自己的id去掉
select friend_id from xxx where user_id in (select friend_id from xxx where user_id=1) and friend_id not in(select friend_id from xxx where user_id=1) and friend_id <> 1

[color=red]括号内为一度好友查询[/color]
可以根据group by 分下组 就知道了自己不认识的人 和自己有多少个共同好友 也就是人人的好友推荐了
如果要是查询两人的共同好友,我又要开一贴了,况且我这是sql数据库 人人好像用的nosql,想不管这么多 :D 写完了
欢迎大家提意见
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值