首页 > 解决方案 > 给定mysql中的一些父ID,如何选择递归结构?

问题描述

我正在尝试获取给定多个 parent_id 的所有文件夹和后续子文件夹。数据库表的结构如下:

   id           name         parent_id
   1           Folder1          null
   2           Folder2          null  
   3           Folder3           1
   4           Folder4           1
   5           Folder5           2
   6           Folder6           2
   7           Folder7           4

以下查询适用于单个 id,但我想避免执行多个查询。对于多个 id,例如 1 和 6,它应该返回行(1、3、4、7 和 6)。

SELECT id,
       name,
       parent_id
FROM
  (SELECT *
   FROM folder_categories
   ORDER BY parent_id, id) categories_sorted,
  (SELECT @pv := ?) initialisation
WHERE (FIND_IN_SET(parent_id, @pv)
       AND @pv := CONCAT(@pv, ',', id))
      OR id = ?

注意:问号可能是任何 id。

知道如何调整此查询以接受多个 id 吗?

编辑:我的 mysql 版本是 5.7,所以不幸的是 WITH RECURSIVE 不可用。

标签: mysqlhierarchical-data

解决方案


对于多个 id,例如 1 和 6,它应该返回行(1、3、4、7 和 6)。

如果您可以使用 CTE (MySQL8),则以下查询将返回它们。

with recursive cte as
( select id, name, parent_id, id as top
   from folder_categories
   where id in (1,6)
  union all select a.id, a.name, a.parent_id, b.top
   from folder_categories a inner join cte b on a.parent_id=b.id)
select * from cte;

分贝小提琴


推荐阅读