mysql有3个共同好友_共同好友mysql
1. 好友关系
传统:uid、 friendId
缺陷:对于海量数据,100w用户,每人50个好友,则有 100w * 50的数据,数据量颇大
改进1:分表
根据uid hash成多个数据表,这样保障一个递增关系
缺陷:处理共同好友、相识度问题无从下手
改进2:聚集
uid、friendIds(23,45,89,…)
问题1:申请好友
方法1:增加数据表记录申请关系 uid, requestFriendIds(3,56,5655)
方法2:好友表增加字段 requestFriendIds(3,56,5655)
问题2:共同好友
(1) friendid IN (我的所有好友) //跟我的好友集合是好友
(2) uid != ‘我’ //这个uid不是我
(3) //跟我不是好友
(4) //按照uid分组,并且共同好友大于1
新设计sql写成:
先查出我、我的好友
select a.uid, count(a.uid) as NUM
FROM table a
WHERE a.friendIds
and a.uid <> ‘我’
and uid not in (我的好友)
GROUP BY a.uid HAVING COUNT(uid) >= 1
ORDER BY NUM DESC
这个时候问题出来了,在做共同好友的时候,显然需要知道这个好友的交叉,
比如 a的好友是(1,2,3) b的好友是(3,4,5)
那么共同好友有一个是3,现在需要知道这个共同好友个数,即求(1,2,3)和(3,4,5)的交集个数
没办法,只能在mysql中自定义function
如下:
(1), 比如(1,2,3,4) get_split_str(str1, 3); 指的是 3,即分个获得字符串
原理:1,2,3,4 比如找到3 先找到 1,2,3 然后翻转变成3,2,1 然后找到第一个字串就是3
get_split_str(str, f_order)
begin
declare delimiter char;
declare rs char;
set delimiter = ',';
set rs = reverse(substring_index(reverse(substring_index(str,delimiter,f_order)),delimiter,1));
return rs;
end
(2) 分割后的字串个数
原理:1,2,3,4 字符串长度 – (替换分隔符的字符串长度) + 1
get_split_num(str)
begin
declare delimiter char;
set delimiter=',';
return 1+(length(str) - length(replace(str,delimiter,'')));
end
(3) 两个字符串集合的交集个数,比如(1,2,3) (3,4,5) 结果是1
get_intersect_num(str1, str2)
begin
declare num int;
declare i int ;
declare val char;
declare intersect_num int default 0;
set num=get_split_num(str1);
set i=1;
while i<=num do
set val = get_split_str(str1, i);
if FIND_IN_SET(val, str2) then
set intersect_num = intersect_num+1;
end if;
set i=i+1;
end while;
return intersect_num;
end
这些在navicate写的,所以没有加标签和参数
最后的sql是
首先求出 我的好友记录
$uid=''; //我自己
$row = $db->getRow("select * from friend where uid = '$uid' ");
$friensStr = '';
$sql = "select uid, get_intersect_num('{$row['friendids']}', friendids) as NUM
FROM table
WHERE NUM > 0
and a.uid <> '$uid'
and uid not in ($friensStr)
ORDER BY NUM DESC";
mysql有3个共同好友_共同好友mysql相关推荐
- sae mysql 同步本地_MYSQL入门之三_将本地MySQL数据导入SAE数据库_MySQL
bitsCN.com MYSQL入门之三_将本地MySQL数据导入SAE数据库 1. MySQL字符集 MySQL的默认字符集是latin1,将本地MySQL库导出成sql,再导入到SAE的MySQL ...
- mysql双机热备 读写分离_轻松搭建MySQL主从复制、读写分离双机热备)
注意:如果此步骤始终为空设置(0.00秒),则表示先前的my.cnf配置不正确,请返回并重试检查配置步骤. (从)数据库中的配置 1.修改从属库的数据库配置文件 [root @ localhost]# ...
- mysql数据库+易语言的应用_易语言mysql数据应用源码
易语言mysql数据应用源码 易语言mysql数据应用源码 系统结构:注册账号,连接Mysql,用户注册验证码,修改密码验证码,忘记密码验证码,修改密码,忘记密码, ======窗口程序集1 | | ...
- mysql 查询用户最后登陆时间_弄懂mysql:mysql的通信协议
我准备从mysql的实现出发,将mysql好好理解一下,从他的逻辑结构一层一层出发,感受一下,所以再学第一层之前,要先对mysql整体的逻辑结构有一个初步认识 mysql逻辑架构 整体来说,MySql ...
- mysql修改表结构大表_在线修改MySQL大表的表结构
由于某个临时需求,需要给在线MySQL的某个超过千万的表增加一个字段.此表在设计之时完全按照需求实现,并没有多余的保留字段. 我们知道在MySQL中如果要执行ALTER TABLE操作,MySQL会通 ...
- mysql 聚合函数内比较运算符_关于常用 MYSQL 聚合函数,其他函数 ,类型转换,运算符 总结...
/* 关于MYSQL 聚合函数,其他函数 ,类型转换,运算符 总结,*/ -- 1 运算符优先级 /* 12.1.1. 操作符优先级 以下列表显示了操作符优先级的由低到高的顺序.排列在同一行的操作符 ...
- 详解mysql数据库的启动与终止_详解MySQL数据库的启动与终止(一)
由于MySQL服务器具有多种安装分发,而且能够运行在多种操作平台之上,因此它的启动与停止的方法也多种多样.你可以根据实际情况使用其中的一种.在你安装.升级或者维护系统时,你可能需要多次启动和终止服务器 ...
- 登录mysql时 未找到 grant命令_我在mysql数据库中可以登陆,为什么用grant命令创建用户时提示错误?...
问题表象: 我的mysql中的 my.ini文件配置: [csharp] view plaincopyprint? #Path to installation directory. All paths ...
- 自动清理mysql的lock进程的脚本_自动清理MySQL的Lock进程的脚本
自动清理MySQL的Lock进程的脚本 作者:小涵 | 来源:互联网 | 2018-07-13 21:01 阅读: 915 最近数据库服务器在某一时段进程数忽然暴增,导致数据库服务器死掉,根据日志查询 ...
最新文章
- 生态伙伴 | 小鹅通企学院入驻飞书,助力企业一键打造自己的企业大学
- 高等数学-关于第二类面积分的对称性问题
- Visual Studio原生开发的20条调试技巧(下)
- 统计决策理论2 条件分布上
- 使用java命令运行class文件提示“错误:找不到或无法加载主类“的问题分析
- 以阿里云RPA为例,来告诉你到底RPA是什么?
- 软链接,xcode接lua文件夹
- 面试经验:求职面试时的835守则
- 编程语言----00程序员常用网站
- Linux基础命令---vmstat显示虚拟内存状态
- 虚拟机桥接模式网络配置
- 华硕 ZenFone 国产新机盘点
- DC 逻辑综合的基本流程
- linux查看文件大小ls
- 异常收集 ----雨之殇
- 微软承认部分 Win10 安装 12 月更新后出现 0xc000021a 蓝屏错误
- 带你了解下Kafka的客户端缓冲池技术
- python求不规则图形面积_Python求阴影部分面积
- ubantu 安装显卡
- 非标机械设计Excel表格伺服电机选型计算公式软件机器设备自动化