子节点通过递归查询所有父节点的信息

我想实现根据子节点查找所有父节点的数据的sql,最好是5.7以下版本的sql,望知道的给予解答,一定感谢。

img

小魔女参考了bing和GPT部分内容调写:
根据子节点查找所有父节点的数据,可以使用递归查询的方式实现。

假设表中有一个字段叫做parent_id,用来表示父节点的id,那么可以使用如下的SQL语句来实现:

WITH RECURSIVE parent_data AS (
  SELECT id, parent_id
  FROM table
  WHERE id = ? -- 子节点的id
  UNION ALL
  SELECT t.id, t.parent_id
  FROM table t
  INNER JOIN parent_data pd
  ON t.id = pd.parent_id
)
SELECT * FROM parent_data;

上面的SQL语句是基于PostgreSQL,如果是MySQL 5.7以下的版本,可以使用如下的语句:

SELECT t1.*
FROM table t1
JOIN (
  SELECT t2.parent_id
  FROM table t2
  WHERE t2.id = ? -- 子节点的id
  UNION ALL
  SELECT t3.parent_id
  FROM table t3
  JOIN (
    SELECT t4.parent_id
    FROM table t4
    WHERE t4.id = ? -- 子节点的id
    UNION ALL
    SELECT t5.parent_id
    FROM table t5
    JOIN (
      SELECT t6.parent_id
      FROM table t6
      WHERE t6.id = ? -- 子节点的id
      UNION ALL
      SELECT t7.parent_id
      FROM table t7
      JOIN (
        SELECT t8.parent_id
        FROM table t8
        WHERE t8.id = ? -- 子节点的id
        UNION ALL
        SELECT t9.parent_id
        FROM table t9
        JOIN (
          SELECT t10.parent_id
          FROM table t10
          WHERE t10.id = ? -- 子节点的id
        ) t10
        ON t9.id = t10.parent_id
      ) t7
      ON t6.id = t7.parent_id
    ) t5
    ON t4.id = t5.parent_id
  ) t3
  ON t2.id = t3.parent_id
) t1
ON t1.id = t1.parent_id;

以上两个SQL语句都是以子节点的id作为起点,通过递归查询,查询出所有父节点的数据。
回答不易,记得采纳呀。

在MySQL5.7以下版本中,可以使用递归查询来实现根据子节点查找所有父节点的数据。以下是一个示例SQL:


SET @parent_id = 'your_child_node_id';

SELECT *
FROM your_table
WHERE id = @parent_id

UNION

SELECT t.*
FROM your_table t
JOIN (
  SELECT @parent_id AS parent_id, @parent_id := parent_id
  FROM your_table
  WHERE id = @parent_id
) r ON t.id = r.parent_id

在这个SQL中,首先将变量 @parent_id 设置为子节点的 ID。然后查询所有 id 等于 @parent_id 的记录,并将其与递归查询的结果进行 UNION 操作,以获取所有父节点的数据。

递归查询部分使用了一个子查询,该子查询会重复执行直到 @parent_id 为空。在每次执行子查询时,它会返回一个记录,其中包含当前父节点的 id 和上一级父节点的 parent_id,然后将 @parent_id 设置为上一级父节点的 parent_id。递归查询会在 @parent_id 为空时停止,然后将 id 等于最终父节点 parent_id 的记录返回。