互相关注是好友的问题

落舞者 发布于 2014/09/24 22:29
阅读 412
收藏 1
PHP

关于微博互相关注就是好友的问题

现在有个表用来存用户关系如follow表

user_id,follow_id两个字段

用户A关注了用户B

那么存一条

user_id,follow_id

A         B

当A关注B,B也关注A时候认为 互相是好友关系。

那么我该怎么查A的好友列表呢?


加载中
0
双城记
双城记
select f.follow_id from follow as f where f.user_id=:A_ID
落舞者
落舞者
。。。互相关注的时候是好友。你这个只是在查找谁关注我
0
雨无晴
雨无晴

类似这样:

select a.follow_id from follow as a 

inner join follow as b on a.follow_id  = b.user_id

where a.user_id = 1001 and b.follow_id = 1001

雨无晴
雨无晴
回复 @落舞者 : 设置主键 user_id,follow_id 和唯一索引follow_id,user_id,完全解决性能问题。但是这种问题的解决方案还是偏向于NOSQL
落舞者
落舞者
嗯我也也是这样想的,但是在担心效率
0
开源无憾
开源无憾
userA,userB,relationship
落舞者
落舞者
回复 @落舞者 : 这样是不是很麻烦。。
落舞者
落舞者
relationship 是不是有两个类型 1 单向,2双向 然后当第一个人关注的时候是1 第二个人关注时候先检测是否关注我了,是的话,同时标记这两条为2, 取消的时候标记为1?
0
金三胖
金三胖
再加一个字段,记录A 和 B的关系,A关注B时,如果B已经关注了A,则把两条记录的关系字段都标记成互相关注。这样查询好友列表时会很快
金三胖
金三胖
回复 @落舞者 : 不麻烦,每次关注和取消关注的时候检查一下关系,更新一下就可以了。总比以后为了解决查询效率上的麻烦来得轻松吧
落舞者
落舞者
但是这样 是不是有关系变化的时候很麻烦,比如说两个人互相关注了,有一个人取消关注了。。
0
傲罗
傲罗

A用户的uid是1 B用户的uid是2

那么一张关系表可以这样设计

id minuid maxuid status

minuid是存两个用户之间uid比较小的uid

maxuid是存两个用户之间uid比较大的uid

status为1代表a关注b 2代表b关注a 3代表互相关注

如果查询两个人之间是否互相关注就可以根据uid大小来对应到minuid maxuid 然后 status=3来查询

select * from table where minuid = 1 AND maxuid = 2 AND status = 3;

落舞者
落舞者
这样的话查找 1用户关注的时候就不好找了 需要 select * from table where (minuid = 1 AND status = a) or (maxuid = 1 AND status = b) 这样了。。
0
泡不烂的凉粉
泡不烂的凉粉

select xxx from table A,table B where A.follow_id = B.user_id and A.user_id=B.follow_id AND A.user_id="要查询用户ID"

0
开源无憾
开源无憾
userA,userB的组合在表中是唯一的,可作为索引;relationship字段有四个可选值,0到3,0表示互相不关注,1表示A关注了B,2代表B关注了A,3代表互相关注;
0
方棱
方棱
查2次,取交集
0
朱宏青
朱宏青
建议在互相关注的时候就进行判断 
0
黑狗
黑狗

引用来自“朱宏青”的评论

建议在互相关注的时候就进行判断 

我的思路也是这样。

每个人有一个好友表。

关注的时候,判断被关注人的好友表是否有我。如果有我,则把把关注人的数据标志位改为“2”。同时插入一条新数据,“我的好友,b”。

如果查不到,则插入数据“我的关注,b”

水牛叔叔
水牛叔叔
这样的确挺方便的。不过每个人一张好友表的做法相当于把sql当nosql用了
黑狗
黑狗
这样你可以只查好友,只查关注,好友和关注同时查并且按照关注标志位排序。 前端显示的时候也比较方便
返回顶部
顶部