日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql有3个共同好友_共同好友mysql

發(fā)布時(shí)間:2024/4/14 数据库 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql有3个共同好友_共同好友mysql 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。