如何在MYSQL View中使用递归

unhi4e5o  于 2023-03-07  发布在  Mysql
关注(0)|答案(1)|浏览(100)

我有一个名为categories的表,其中有三列:idparentIdnameparentId列是引用同一表的id列的外键。

类别

| id | parentId | name      |
|----|----------|-----------|
|  1 |   NULL   | expense   |
|  2 |        1 | food      |
|  3 |        2 | grocery   |
|  4 |        3 | meat      |
|  5 |        3 | fruit     |
|  6 |        2 | dining    |

我想创建一个名为categories_view的视图,该视图返回categories表并添加一个名为path的列,该列为该记录创建一个路径,该路径是父记录的路径(如果父记录不是NULL)和name的名称。

类别视图

| id | parentId | name      | path                             |
|----|----------|-----------|----------------------------------|
|  1 |   NULL   | expense   | expense                          |
|  2 |        1 | food      | expense > food                   |
|  3 |        2 | grocery   | expense > food > grocery         |
|  4 |        3 | meat      | expense > food > grocery > meat  |
|  5 |        3 | fruit     | expense > food > grocery > fruit |
|  6 |        2 | dining    | expense > food > dining          |

如果我用javascript或其他工具来做这件事,我可以只使用递归,但我不知道如何在SQL视图中做到这一点。

jv4diomz

jv4diomz1#

可以在视图中使用递归CTE:

CREATE VIEW categories_view AS
WITH RECURSIVE cte AS (
    SELECT id, parentId, name, name AS path
    FROM categories
    WHERE parentId IS NULL
    UNION ALL
    SELECT c.id, c.parentId, c.name, CONCAT_WS(' > ', t.path, c.name)
    FROM categories c
    INNER JOIN cte t ON c.parentId = t.id
)

SELECT *
FROM cte
ORDER BY id;

这是一个demo,显示逻辑工作正常。

相关问题