帮助中心/最新通知

质量为本、客户为根、勇于拼搏、务实创新

< 返回文章列表

【服务器相关】SQL开发知识:详细聊一聊mysql的树形结构存储以及查询

发表时间:2025-06-16 03:46:00 小编:主机乐-Yutio

本文主要研究一下mysql的树形结构存储及查询

存储parent

这种方式就是每个节点存储自己的parent_id信息

  • 建表及数据准备

不存储parent_id,改为存储lft,rgt,它们的值由树的先序遍历顺序决定

  • 建表及数据准备

CREATE TABLE `menu_preorder` (
`id` int(11) NOT NULL,
`name` varchar(50) NOT NULL,
`lft` int(11) NOT NULL DEFAULT ‘0’,
`rgt` int(11) NOT NULL DEFAULT ‘0’,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;

1(level1a)14
2(level2a)78(level2b)13
3(level3a-2a)4 5(level3b-2a)6 9(level3c-2b)10 11(level3d-2b)12

INSERT INTO `menu_preorder` (`id`, `name`, `lft`, `rgt`) VALUES
(1, ‘level1a’, 1, 14),
(2, ‘level2a’,2, 7),
(3, ‘level2b’,8, 13),
(4, ‘level3a-2a’, 3, 4),
(5, ‘level3b-2a’, 5, 6),
(6, ‘level3c-2b’, 9, 10),
(7, ‘level3d-2b’, 11, 12);

select * from menu_preorder
+—-+————+—–+—–+
| id | name | lft | rgt |
+—-+————+—–+—–+
| 1| level1a| 1 | 14|
| 2| level2a| 2 | 7 |
| 3| level2b| 8 | 13|
| 4| level3a-2a | 3 | 4 |
| 5| level3b-2a | 5 | 6 |
| 6| level3c-2b | 9 | 10|
| 7| level3d-2b | 11| 12|
+—-+————+—–+—–+

  • 查询

— 查询某个节点及其子节点,比如level2b
select * from menu_preorder where lft between 8 and 13
+—-+————+—–+—–+
| id | name | lft | rgt |
+—-+————+—–+—–+
| 3| level2b| 8 | 13|
| 6| level3c-2b | 9 | 10|
| 7| level3d-2b | 11| 12|
+—-+————+—–+—–+

— 查询所有叶子节点
SELECT name
FROM menu_preorder
WHERE rgt = lft + 1;

+————+
| name |
+————+
| level3a-2a |
| level3b-2a |
| level3c-2b |
| level3d-2b |
+————+

— 查询某个节点及其父节点
SELECT parent.*
FROM menu_preorder AS node,
menu_preorder AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.name = ‘level2b’
ORDER BY parent.lft;

+—-+———+—–+—–+
| id | name| lft | rgt |
+—-+———+—–+—–+
| 1| level1a | 1 | 14|
| 3| level2b | 8 | 13|
+—-+———+—–+—–+

— 树形结构展示
SELECT CONCAT( REPEAT(‘ ‘, COUNT(parent.name) – 1), node.name) AS name
FROM menu_preorder AS node,
menu_preorder AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.name
ORDER BY node.lft;

+————–+
| name |
+————–+
| level1a|
|level2a |
| level3a-2a |
| level3b-2a |
|level2b |
| level3c-2b |
| level3d-2b |
+————–+

好处是通过lft进行范围(该节点的lft,rgt作为范围)查找就可以,缺点就是增删节点导致很多节点的lft及rgt都要修改

小结

  • 存储parent的方式最为场景,一般树形结构数据量不大的话,直接在应用层内存构造树形结构和搜索
  • 存储path的好处是可以借助path来查找节点及其子节点,缺点就是移动node需要级联所有子节点的path,比较费劲
  • MPTT的方式好处是通过lft进行范围(该节点的lft,rgt作为范围)查找就可以,缺点就是增删节点导致很多节点的lft及rgt都要修改

doc

  • Managing Hierarchical Data in MySQL
  • hierarchical-data-database
  • hierarchical-data-database-2
  • hierarchical-data-database-3

到此这篇关于mysql树形结构存储以及查询的文章就介绍到这了,更多相关mysql树形结构存储及查询内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


联系我们
返回顶部