我有一张桌子叫
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 视图中做到这一点。
您可以在视图中使用递归 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 显示逻辑正在工作。