Mysql 获取好友列表n深度
我有一些简单的餐桌朋友,看起来像这样: 使用个人id\u friend的id及其朋友id\u friend\u的id 我正在尝试获取某个特定用户的所有好友ID,以便让所有人以确定的深度链接到某个特定用户 我所尝试的深度为2获取用户的朋友及其朋友的朋友:Mysql 获取好友列表n深度,mysql,sql,Mysql,Sql,我有一些简单的餐桌朋友,看起来像这样: 使用个人id\u friend的id及其朋友id\u friend\u的id 我正在尝试获取某个特定用户的所有好友ID,以便让所有人以确定的深度链接到某个特定用户 我所尝试的深度为2获取用户的朋友及其朋友的朋友: SELECT DISTINCT a.id_friend_of FROM friend a JOIN friend b ON b.id_friend = a.id_friend_of WHERE a.id_friend = 1 A
SELECT DISTINCT
a.id_friend_of
FROM friend a
JOIN friend b
ON b.id_friend = a.id_friend_of
WHERE a.id_friend = 1 AND
b.id_friend <> a.id_friend
但它不起作用,我只得到用户的朋友,而不是朋友的朋友。
我能做些什么来让它工作
获取用户的朋友及其朋友的朋友
您可以通过对表进行简单的筛选查询获得用户的朋友,也可以通过表的自联接获得朋友的朋友。
然后使用UNION获得两个查询的结果,这也将删除重复项:
SELECT id_friend_of
FROM friend
WHERE id_friend = 1
UNION
SELECT f2.id_friend_of
FROM friend f1 INNER JOIN friend f2
ON f2.id_friend = f1.id_friend_of
WHERE f1.id_friend = 1 AND f2.id_friend_of <> 1
对于2级以上的级别,最好使用MySql 8.0+的递归查询:
WITH RECURSIVE cte AS (
SELECT *, 1 level
FROM friend
WHERE id_friend = 1
UNION ALL
SELECT f.*, level + 1
FROM cte c INNER JOIN friend f
ON f.id_friend = c.id_friend_of
WHERE f.id_friend_of <> 1 AND level < 2 -- for level = 2
)
SELECT DISTINCT id_friend_of
FROM cte
请参阅简化的。为显示的源数据添加所需的输出。我只想要一个ID列表,显示严格要求为显示的源数据获取的ID列表。您有递归查询的示例吗?我正在使用MySQL 8.0。21@Jessy这在我的答案里。谢谢,太棒了!