如何在MYSQL View中使用递归

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

我有一张桌子叫

categories
。其中,有三列:
id
parentId
,和
name
parentId
列是引用同一表的
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
.

的名字

categories_view

| 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 视图中做到这一点。

mysql recursive-query
1个回答
3
投票

您可以在视图中使用递归 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 显示逻辑正在工作。

© www.soinside.com 2019 - 2024. All rights reserved.