免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3616 | 回复: 4
打印 上一主题 下一主题

【讨论中】请问mysql好友关系查询的实现? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-16 18:23 |只看该作者 |倒序浏览
本帖最后由 cenalulu 于 2013-03-18 10:02 编辑

--
-- 表的结构 `user_friends`
--

CREATE TABLE IF NOT EXISTS `user_friends` (
  `seq` int(10) unsigned NOT NULL auto_increment COMMENT '自增序号',
  `uid` int(10) unsigned NOT NULL COMMENT '用户UID',
  `frienduid` int(10) unsigned NOT NULL COMMENT '好友UID',
  `type` tinyint(3) unsigned NOT NULL default '0' COMMENT '关系类型',
  `createtime` int(10) unsigned NOT NULL default '0' COMMENT '创建时间',
  `disabled` tinyint(3) unsigned NOT NULL default '0' COMMENT '是否启用',
  PRIMARY KEY  (`seq`),
  UNIQUE KEY `uid` (`uid`,`frienduid`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='用户好友关系' AUTO_INCREMENT=4 ;

--
-- 转存表中的数据 `user_friendship`
--

INSERT INTO `user_friends` (`seq`, `uid`, `frienduid`, `type`, `createtime`, `disabled`) VALUES
(1, 10000000, 10000001, 0, 0, 0),
(2, 10000001, 10000000, 0, 0, 0),
(3, 10000000, 10000002, 0, 0, 0);



===============

双向关注:
SELECT `A`.`frienduid` as uid FROM (`user_friends` A) LEFT JOIN `user_friends` B ON `A`.`frienduid`=`B`.`uid` WHERE `A`.`uid` = 10000001 AND `B`.`frienduid` = 10000000 LIMIT 10

单向关注(这里有疑问):
SELECT `frienduid` as uid FROM (`user_friends`) WHERE `uid` = 10000000 LIMIT 10

这个单向关注查询,会把包括双向关注的也查询出来,现在想把已经双向关注的给排除掉,
请问一下怎么用一条语句,实现这样的需求。


另外,这样的关系数据,估计也就100w这样吧,left join 查询压力应该不大吧?
还有像这样的关系,大家建议存一条,通过 type 类型的标准方向关系,还是存两条单向关系好一点?

谢谢~~

论坛徽章:
0
2 [报告]
发表于 2013-03-17 23:44 |只看该作者
SELECT `A`.`frienduid` as uid,`B`.`frienduid` as fid
FROM `user_friends` A
LEFT JOIN `user_friends` B ON `B`.`uid`=`A`.`frienduid`  AND `B`.`frienduid` = `A`.`uid
WHERE `A`.`uid` = 10000001;
结果包含所有关注者ID,其中 fid 不为NULL的代表双向关注(可以使用having fid is not null 过滤)


表结构建议
增加type列标记关注类型,只包含双向关注、单向关注,不包含被关注(即粉丝)
粉丝单建1张表存储。

论坛徽章:
0
3 [报告]
发表于 2013-03-18 15:06 |只看该作者
回复 2# G8bao7


不是太明白,怎么个分法,还有分了后怎么处理?

比如:
只包含双向关注、单向关注做为一张表,
粉丝单建1张表存储,做为一张表。

A  与  B,是单向关注,但关注方(A)对于被关注方(B)来说,就是被关注方(B)的粉丝啊,
这里怎么处理拆分两张表?不是太明白。

论坛徽章:
0
4 [报告]
发表于 2013-03-18 16:31 |只看该作者
A 关注 B,B没有关注A。假设type:1代表单向关注,2代表双向关注
两个表中的数据如下(其他列忽略)
user_friends(uid`, `frienduid`, `type`)
A,B,1

user_fans(uid`, `fansuid`)
B,A

如果A 关注B,B也关注A,则表中数据如下
user_friends(uid`, `frienduid`, `type`)
A,B,2
B,A,2

user_fans(uid`, `fansuid`)
B,A
A,B


以后如果按照uid进行水平拆分,也比较简单!

论坛徽章:
0
5 [报告]
发表于 2013-03-18 17:26 |只看该作者
回复 4# G8bao7


    good!!

没试过这样考虑,瞬间解决问题了!!

非常感谢!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP