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