当前位置: 首页 > 面试题库 >

分离度查询

国兴文
2023-03-14
问题内容

我有一个成员对成员连接表。模式为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列,用作on
/
off开关。任何具有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位成员,我们问的是1位朋友和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


 类似资料:
  • 问题内容: 我正在使用D3.js进行网络分析,以显示应用程序中已连接的电话号码(分离度最低为6度)。查找初始连接的SQL(postgres)在下面,非常简单。但是,我很困惑如何修改它以遍历六个级别的连接然后停止。 通过研究此问题,我发现了提到通用表表达式(CTE)和递归的方法,但是不确定如何在此处应用它们。 我的目标是通过一个公用电话哈希将所有玩家连接到初始玩家($ 1),然后通过一个公用电话哈希

  • 问题内容: 我想根据数字与查询的接近程度对文档进行评分。由于我有两个文件和,查询 然后我想。换句话说,我想要类似针对数字的模糊查询。我将如何实现?用例是我想支持价格查询(精确或范围),但想对不在边界内的商品进行排名。 问题答案: 可以使用custom_score查询来实现,其中脚本将根据确切价格与所需价格之间的差的绝对值确定提升。期望的价格应作为参数传递给脚本,以避免针对每个请求重新编译脚本。 另

  • 问题内容: Java专家能否请您帮我写以下查询作为SQL查询条件查询的一部分。 问题答案: 您需要编写一个相关的子查询。假设属性/类名称与上面的列/表名称匹配:

  • 二叉搜索树(BST)中节点的深度与其与根的距离相同吗?我想是的,但我不确定。我相信距离是树的一般概念,深度是应用于BST的概念。

  • 你处于“超脱的脑袋”状态。您可以四处查看,进行实验性更改并提交它们,并且可以丢弃在此状态下进行的任何提交,而不会通过执行另一次签出影响任何分支。 显然我可以签出“master”,但这是一个模棱两可的引用。我只想知道消除分支名称歧义的“Git方式”是什么,而不分离Head。

  • 距离查询 距离查询,是指查询指定几何对象一定距离范围内的地物。对于点几何对象,则查询以该点为圆心,以距离为半径画圆,落在该圆形范围内的地物;对于线和面几何对象,则查询距离对象边界一定范围内的地物。 以 World 数据服务为例。使用接口 ol.supermap.QueryService 在图层 “Capitals@World.1” 中查找距离指定点为10度(地图坐标单位)的矢量要素。 // 添加查