mysql - 不使用赋值运算符的 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
有没有办法使用“WITH RECURSIVE”来获得这个结果?
解决方案
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
推荐阅读
- java - Firebase 数据库不适用于 java 应用程序
- javascript - 您将如何使用 javascript 实现对 Web Purify API 的调用?
- python - 线程和 Tkinter 不能一起工作
- angular - Angular 6 EventEmitter 不起作用
- mod-auth-openidc - mod_auth_openidc 将声明作为公共位置的 http 标头(全部授予)
- c++ - 从 Q_INVOKABLE 返回的 C++ 对象由 QML 拥有和收集的规则是什么?
- azure - 如何从专用网络中在 Azure 自动化中注册 AzureVM
- d3.js - D3:如何在数据的最小值/最大值和轴的最小值/最大值之间添加边距?
- apache-kafka - 如何查询 Kafka 主题以根据某些条件获取所有记录?
- java - 在 MVC 模式中将模型和动作划分为类的最佳方法是什么