I have created a WITH RECURSIVE function and would like to use it with an INSERT INTO function so that the results insert into the path column.
category_id | category_name | parent_id | path |
---|---|---|---|
1 | Root | 0 | |
2 | Fishing | 1 | |
3 | Sea | 2 | |
4 | Lures | 3 | |
7 | Coarse | 2 | |
8 | Lures | 7 | |
9 | Fly | 2 |
I have tried the following code but the results do not fall in line with the table.
INSERT INTO categories (path) WITH RECURSIVE cte AS ( SELECT category_id, category_name, parent_id, category_name path FROM categories WHERE parent_id = 0 UNION ALL SELECT c.category_id, c.category_name, c.parent_id, CONCAT(cte.path, '/', c.category_name) FROM categories c JOIN cte ON cte.category_id = c.parent_id ) SELECT path FROM cte;
category_id | category_name | parent_id | path |
---|---|---|---|
1 | Root | 0 | |
2 | Fishing | 1 | |
3 | Sea | 2 | |
4 | Lures | 3 | |
7 | Coarse | 2 | |
8 | Lures | 7 | |
9 | Fly | 2 | |
null | null | null | Root |
null | null | null | Root/Fishing |
null | null | null | Root/Fishing/Sea |
null | null | null | Root/Fishing/Coarse |
null | null | null | Root/Fishing/Fly |
null | null | null | Root/Fishing/Sea/Lures |
null | null | null | Root/Fishing/Coarse/Lures |
I have the code in a db fiddle db fiddle
Advertisement
Answer
Here is my executed code.
UPDATE categories ca inner join ( WITH RECURSIVE cte AS ( SELECT category_id, category_name, parent_id, category_name path FROM categories WHERE parent_id = 0 UNION ALL SELECT c.category_id, c.category_name, c.parent_id, CONCAT(cte.path, '/', c.category_name) FROM categories c JOIN cte ON cte.category_id = c.parent_id ) select * from cte ) t on ca.category_id = t.category_id SET ca.path = t.path ; SELECT * FROM categories;