通过辅助表进行递归选择

问题描述 投票:1回答:1

我很难拼凑一下。我不擅长数据库或复杂查询。

数据库

我正在使用最新的MariaDB版本。

我具有这样的数据库表配置,代表分层数据结构:

|----------------------|
| fieldsets            |
|----+-----------------|
| id | parent_field_id |
|----+-----------------|
| 1  | NULL            |
| 2  | 1               |
|----------------------|

|-------------------------|
| fields                  |
|----+--------------------|
| id | parent_fieldset_id |
|----+--------------------|
| 1  | 1                  |
| 2  | 1                  |
|-------------------------|

问题

我正在尝试组合一个递归查询。我需要选择给定层次结构中的每个字段集。例如,在上面的简化示例中,我要选择id = 1的字段集以及每个后代字段集。

仅通过辅助表的列获得层次结构中任何给定级别的下一个梯级的ID。

我的尝试

到目前为止我所拥有的查询(不起作用):

WITH RECURSIVE all_fieldsets AS (
    SELECT fieldsets.* FROM fieldsets WHERE id = 125
    UNION
    SELECT fieldsets.* FROM fieldsets WHERE fieldsets.id IN (SELECT fs.id FROM fieldsets fs LEFT JOIN fields f ON f.id = fs.parent_field_id WHERE f.parent_fieldset_id = fieldsets.id)
)
SELECT * FROM all_fieldsets

我的研究

我也很难找到适合我的用例的示例。像我这样,涉及一个只与自身有关系而不是通过辅助表的表的层次结构有很多结果。当您不知道某些概念的正确术语时,这很困难,而且任何外行的解释似乎都会产生太多切线搜索结果。

我的请求

我将非常感谢所有能指出我要去哪里的人,并可能建议可以使用的查询的概要。

sql database mariadb recursive-query
1个回答
0
投票

我在当前代码中看到的主要问题是CTE的递归部分(在联合之后出现的查询)没有从递归CTE中选择,应该是这样。考虑此更新版本:

WITH RECURSIVE all_fieldsets AS (
    SELECT * FROM fieldsets WHERE id = 125
    UNION ALL
    SELECT f1.*
    FROM fieldsets f1
    INNER JOIN all_fieldsets f2
        ON f1.parent_field_id = f2.id
)

SELECT *
FROM all_fieldsets;
© www.soinside.com 2019 - 2024. All rights reserved.