加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

mysql – 疏散度查询

发布时间:2021-05-21 10:04:59 所属栏目:编程 来源:网络整理
导读:我有一个成员到成员毗连的表.架构是member_id,friend_id,is_active.我想成立一个伴侣伴侣的成员接洽列表.我不确定如那里理赏罚查询,更不消说以半优化的方法相识. 上面的表以一种方法事变,个中member_id和friend_id在另一个表上基内情同.在我的体系中,除了这一个

我有一个成员到成员毗连的表.架构是member_id,friend_id,is_active.我想成立一个伴侣伴侣的成员接洽列表.我不确定如那里理赏罚查询,更不消说以半优化的方法相识.

上面的表以一种方法事变,个中member_id和friend_id在另一个表上基内情同.在我的体系中,除了这一个表之外,这些id凡是被称为member_id.譬喻,假设我的member_id是21.我的号码可以在无穷量的其他行上作为member_id或friend_id,它可能基于谁最初提倡了现实的情意哀求,我不但愿冗余数据在那边我有诱骗行根基上做同样的工作.

我想查询一下,我不只可以成立一个学位程度(想想LinkedIn),并且我还可以确定一小我私人也许有几多配合的伴侣正在展示(想想Facebook).这里的x因子是我之条件到的is_active列.此列可所以0或1.这是一个简朴的tinyint列,可用作开/关开关.任何与1的伴侣接洽都是起劲的情意,而0正在守候.我必要将此查询基于我的活泼伴侣和他们活泼的伴侣等等.我的伴侣们没有活泼的伴侣都是我的活泼伴侣.

怎样构建这样的查询(纵然我无法表现疏散级别而且只能得到彼此计数)?此刻,我可以想到一些对象,但它涉及查询后查询一些嵌套在轮回中,是的,我只是无法想象对我的处事器的整体机能或康健跟着时刻的推移有什么甜头.

最佳谜底 以下是行使JOIN行使广度优先,最短路径搜刮执行搜刮的要领.这个算法没有神奇之处,由于我们行使MySQL来找到谜底,并且我们没有行使任何行使任何开导式或优化的花式搜刮算法.

我的“伴侣”表具有单向相关,因此我们确实存在一再项,即存储“1到2”和“2对1”.我也解除了is_active,由于实现很明明:

这是数据:

member_id   friend_id
1           2
1           3
1           4
2           1
2           3
2           5
2           6
3           2
3           1
4           1
5           2
6           2
6           7
7           6
7           8
8           7

我们选择了会员1,我们要问的是7个伴侣,7个伴侣,伴侣等等吗?计数0暗示否,计数1暗示是.

SELECT COUNT(*)
FROM friends f1
WHERE f1.member_id = 1
  AND f1.friend_id = 7

假如不是,那么他们是伴侣的伴侣吗?

SELECT COUNT(*)
FROM friends f1
JOIN friends f2
  ON f2.member_id = f1.friend_id
WHERE f1.member_id = 1
  AND f2.friend_id = 7

假如没有,那么伴侣的伴侣呢?

SELECT COUNT(*)
FROM friends f1
JOIN friends f2
  ON f2.member_id = f1.friend_id
JOIN friends f3
  ON f3.member_id = f2.friend_id
WHERE f1.member_id = 1
  AND f3.friend_id = 7

等等…

第三个查询将找到路径“1到2”,“2到6”和“6到7”,返回计数1.

每个查询都变得越发昂贵(因为毗连数目较多),因此您也许但愿在某些时辰限定搜刮.一个很酷的工作是这个搜刮从两头向中间事变,这是一个简朴的优化提议用于最短路径搜刮.

以下是怎样找到成员1的配合伴侣保举:

SELECT f2.friend_id
FROM friends f1
JOIN friends f2
  ON f2.member_id = f1.friend_id
LEFT JOIN friends f3
  ON f3.member_id = f1.member_id
  AND f3.friend_id = f2.friend_id
WHERE f1.member_id = 1
  AND f2.friend_id <> f1.member_id // Not ourself
  AND f3.friend_id IS NULL // Not already a friend

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读