mysql有3个共同好友_共同好友mysql
1. 好友關(guān)系
傳統(tǒng):uid、 friendId
缺陷:對(duì)于海量數(shù)據(jù),100w用戶,每人50個(gè)好友,則有 100w * 50的數(shù)據(jù),數(shù)據(jù)量頗大
改進(jìn)1:分表
根據(jù)uid hash成多個(gè)數(shù)據(jù)表,這樣保障一個(gè)遞增關(guān)系
缺陷:處理共同好友、相識(shí)度問題無從下手
改進(jìn)2:聚集
uid、friendIds(23,45,89,…)
問題1:申請(qǐng)好友
方法1:增加數(shù)據(jù)表記錄申請(qǐng)關(guān)系 uid, requestFriendIds(3,56,5655)
方法2:好友表增加字段 requestFriendIds(3,56,5655)
問題2:共同好友
(1) friendid IN (我的所有好友) //跟我的好友集合是好友
(2) uid != ‘我’ //這個(gè)uid不是我
(3) //跟我不是好友
(4) //按照uid分組,并且共同好友大于1
新設(shè)計(jì)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
這個(gè)時(shí)候問題出來了,在做共同好友的時(shí)候,顯然需要知道這個(gè)好友的交叉,
比如 a的好友是(1,2,3) b的好友是(3,4,5)
那么共同好友有一個(gè)是3,現(xiàn)在需要知道這個(gè)共同好友個(gè)數(shù),即求(1,2,3)和(3,4,5)的交集個(gè)數(shù)
沒辦法,只能在mysql中自定義function
如下:
(1), 比如(1,2,3,4) get_split_str(str1, 3); 指的是 3,即分個(gè)獲得字符串
原理:1,2,3,4 比如找到3 先找到 1,2,3 然后翻轉(zhuǎn)變成3,2,1 然后找到第一個(gè)字串就是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) 分割后的字串個(gè)數(shù)
原理: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) 兩個(gè)字符串集合的交集個(gè)數(shù),比如(1,2,3) (3,4,5) 結(jié)果是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寫的,所以沒有加標(biāo)簽和參數(shù)
最后的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";
超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的mysql有3个共同好友_共同好友mysql的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在mysql中删除表正确的是什么_在My
- 下一篇: linux cmake编译源码,linu