Mysql 获取好友列表n深度

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

我有一些简单的餐桌朋友,看起来像这样:

使用个人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 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这在我的答案里。谢谢,太棒了!