更改递归CTE生成的分层结果的顺序?

时间:2020-06-27 15:44:27

标签: mysql sql common-table-expression

我正在使用MySQL,我想知道是否可以更改递归CTE生成的结果的顺序。

我的表格具有以下列:

|----------|----------|----------|----------|
|   ID     | parentID |  title   |   Sort   |
|----------|----------|----------|----------|
|    1     |    null  |  Maria   |     1    |
|    2     |    1     |  John    |     2    |
|    3     |    2     |  Maria   |     3    |
|    4     |    1     |  Anthony |     1    |
|    5     |    4     |  XXX     |     1    |
|    6     |    4     |  ...     |     2    |
|    7     |    2     |  ...     |     2    |
|    8     |    2     |  ...     |     1    |
|    9     |    1     |  ...     |     3    |

我使用以下查询(我们不考虑排序列)

   WITH RECURSIVE cte AS
    (
      SELECT ID, parentID, title, 0 AS depth, CAST(ID AS CHAR(200)) AS path
        FROM categories WHERE ID = 1
      UNION ALL
      SELECT c.ID, c.parentID, c.title, cte.depth + 1, CONCAT(cte.path, ',', c.ID) 
        FROM categories c 
        JOIN cte ON cte.parentID = c.ID
        WHERE FIND_IN_SET(c.ID, cte.path)=0
    )
    SELECT * FROM cte ORDER BY cte.path

接下来是我们从上述查询中获得的分层结果(以ID为单位)。我们完全忽略了排序列。

Hierarchy Depth
1   2   3
|   |   |
IDs
1
    2
        3
        7
        8
    4
        5
        6
    9

我想要的是一个查询,该查询考虑了sort列并创建了以下顺序。从您看到的ID来看,具有4,2,9的ID分别具有排序编号1,2,3,并且在深度级别2的结果中考虑了该顺序,在所有深度级别中也是如此。

Hierarchy Depth
1   2   3
|   |   |
IDs
1
    4
        5
        6
    2
        8
        7
        3
    9

正在寻找对我的查询的修改以实现上述结果。

1 个答案:

答案 0 :(得分:2)

我认为您可以根据排序优先级构建排序路径。不幸的是,这些似乎在不同的行上重复出现,因此我还将包括原始ID:

WITH RECURSIVE cte AS (
      SELECT ID, parentID, title, 0 AS depth, CAST(ID AS CHAR(200)) AS path,
             CONCAT(sort, '-', id) as sort_path
      FROM categories
      WHERE ID = 2
      UNION ALL
      SELECT c.ID, c.parentID, c.title, cte.depth + 1, CONCAT(cte.path, ',', c.ID) ,
             CONCAT(cte.sort_path, c.sort, '-', c.id, ',') as sort_path
      FROM categories c JOIN
           cte
           ON cte.parentID = c.ID
      WHERE FIND_IN_SET(c.ID, cte.path) = 0
    )
SELECT *
FROM cte
ORDER BY sort_path;

Here是db <>小提琴。对于您的样本数据,这仅深入了一层,因此它实际上并没有显示它是否有效。此外,这还假定id和排序优先级永远不会超过一个字符-顺便说一句,您的查询也是如此。

相关问题