我有categories
表,其中parent_id
是自引用foreign key
。
categories table:
select * from categories;
<表类>category_id添加 名称 parent_id tbody><<tr>1 T1 空 2T2 空 3 T11 1 4病人 1 5T111 3 6T112 3 7T1121 6 8T1122 6 9 T121 4 10T122 4 11T21 2 12 T211 11 13T212 11 14T2111 12 表类>
您可以在CTE中使用CONCAT(parent_path,separator,child_id)
来构建路径。您需要在UNION之前在CTE的第一部分指定'WHERE parent_id IS NULL ',以便我们只包含从根开始的路径。
CREATE TABLE IF NOT EXISTS categories ( category_id int(11) NOT NULL AUTO_INCREMENT, name varchar(255) NOT NULL, parent_id int(11) DEFAULT NULL, created_at timestamp NOT NULL DEFAULT current_timestamp(), PRIMARY KEY (category_id), FOREIGN KEY (parent_id) REFERENCES categories(category_id) ON UPDATE CASCADE ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO categories (`name`,`parent_id`) VALUES ( 'T1', null); INSERT INTO categories (`name`,`parent_id`) VALUES ( 'T2', null); INSERT INTO categories (`name`,`parent_id`) VALUES ( 'T11', 1); INSERT INTO categories (`name`,`parent_id`) VALUES ( 'T12', 1); INSERT INTO categories (`name`,`parent_id`) VALUES ( 'T111', 3); INSERT INTO categories (`name`,`parent_id`) VALUES ( 'T112', 3); INSERT INTO categories (`name`,`parent_id`) VALUES ( 'T1121', 6); INSERT INTO categories (`name`,`parent_id`) VALUES ( 'T1122', 6); INSERT INTO categories (`name`,`parent_id`) VALUES ( 'T121', 4); INSERT INTO categories (`name`,`parent_id`) VALUES ( 'T122', 4); INSERT INTO categories (`name`,`parent_id`) VALUES ( 'T21', 2); INSERT INTO categories (`name`,`parent_id`) VALUES ( 'T211', 11); INSERT INTO categories (`name`,`parent_id`) VALUES ( 'T212', 11); INSERT INTO categories (`name`,`parent_id`) VALUES ( 'T2111', 12);
WITH RECURSIVE cte_name AS ( select category_id, name, parent_id , name AS path from categories where parent_id is null UNION ALL select c.category_id,c.name,c.parent_id, concat_ws(' -> ', cte_name.path, c.name) from categories as c INNER JOIN cte_name ON cte_name.category_id = c.parent_id ) SELECT * FROM cte_name;
category_id | name | parent_id | path----------: | :---- | --------: | :-------------------------1 | T1 |null| T12 | T2 |null| T23 | T11 | 1 | T1 ->T114 | T12 | 1 | T1 ->病人11 | T21 | 2 | T2 ->T215 | T111 | 3 | T1 ->T11→T1116 | T112 | 3 | T1 ->T11→T1129 | T121 | 4 | T1 ->病人→T12110 | T122 | 4 | T1 ->病人→T12212 | T211 | 11 | T2 ->T21→T21113 | T212 | 11 | T2 ->T21→T2127 | T1121 | 6 | T1 ->T11→T112→T11218 | T1122 | 6 | T1 ->T11→T112→T112214 | T2111 | 12 | T2 ->T21→T211→T2111
db<此处小提琴>此处小提琴>