Иерархический древовидный запрос сортировки MySQL без использования оператора присваивания
У меня есть запрос сортировки с иерархической древовидной структурой на основе объяснения расширенного
Теперь мне нужно изменить запрос с помощью «WITH RECURSIVE» из-за будущего удаления в MySQL 8+ оператора присваивания (:=).
Вот образец моего вопроса:
CREATE TABLE `test`.`TestTable` (
`id` INT NOT NULL,
`parentid` INT NOT NULL,
PRIMARY KEY (`id`));
INSERT INTO `test`.`TestTable` (`id`, `parentid`) VALUES ('1', '0');
INSERT INTO `test`.`TestTable` (`id`, `parentid`) VALUES ('2', '1');
INSERT INTO `test`.`TestTable` (`id`, `parentid`) VALUES ('3', '1');
INSERT INTO `test`.`TestTable` (`id`, `parentid`) VALUES ('4', '2');
INSERT INTO `test`.`TestTable` (`id`, `parentid`) VALUES ('5', '3');
INSERT INTO `test`.`TestTable` (`id`, `parentid`) VALUES ('6', '2');
INSERT INTO `test`.`TestTable` (`id`, `parentid`) VALUES ('7', '2');
INSERT INTO `test`.`TestTable` (`id`, `parentid`) VALUES ('8', '3');
INSERT INTO `test`.`TestTable` (`id`, `parentid`) VALUES ('9', '3');
WITH RECURSIVE CTE AS (
SELECT id, parentid, 1 AS level
FROM test.TestTable
WHERE id=1
UNION ALL
SELECT p.id, p.parentid, level + 1
FROM CTE
INNER JOIN test.TestTable p ON p.parentid=CTE.id
)
SELECT * FROM CTE;
Результат показан ниже.
id parentid level
1 0 1
2 1 2
3 1 2
4 2 3
5 3 3
6 2 3
7 2 3
8 3 3
9 3 3
Однако то, что я ищу, - это отображать дерево, как результаты выглядят
id parentid level
1 0 1
2 1 2
4 2 3
6 2 3
7 2 3
3 1 2
5 3 3
8 3 3
9 3 3
Есть ли способ добиться таких результатов с помощью "С РЕКУРСИВНЫМ"?
1 ответ
WITH RECURSIVE CTE AS (
SELECT id, parentid, 1 AS level, CAST(id AS CHAR) path
FROM TestTable
WHERE id=1
UNION ALL
SELECT p.id, p.parentid, level + 1, CONCAT_WS(' ', CTE.path, p.id)
FROM CTE
INNER JOIN TestTable p ON p.parentid=CTE.id
)
SELECT *
FROM CTE
ORDER BY path;
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=5e002350885533d432ffc272ef3917eb