MySQL繁忙度查询_mysql – 分离度查询

以下是使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值