技术文摘
MySQL 中如何查询树状结构数据
MySQL 中如何查询树状结构数据
在数据库开发中,处理树状结构数据是常见的需求。例如,组织架构、商品分类等都呈现树状结构。MySQL 作为广泛使用的关系型数据库,提供了多种方法来查询这类数据。
邻接表模型
这是最常用的存储树状结构的方式。在表中,每条记录包含自身的唯一标识(通常为主键)以及父节点的标识。例如,有一个 categories 表,包含 category_id 和 parent_id 字段。
要查询整个树状结构,可以使用递归 CTE(Common Table Expressions)。递归 CTE 允许我们定义一个递归的查询,逐步构建树状结构。
WITH RECURSIVE category_tree AS (
SELECT category_id, parent_id, category_name
FROM categories
WHERE parent_id IS NULL
UNION ALL
SELECT c.category_id, c.parent_id, c.category_name
FROM categories c
INNER JOIN category_tree ct ON c.parent_id = ct.category_id
)
SELECT * FROM category_tree;
在这个查询中,首先选择根节点(parent_id 为 NULL),然后通过递归,将子节点连接到父节点,逐步构建整个树。
嵌套集模型 嵌套集模型通过为每个节点分配左值和右值来表示树状结构。左值和右值是唯一的整数,通过它们的范围关系可以确定节点在树中的位置。
假设表 categories 包含 category_id、lft 和 rgt 字段。要查询某个节点及其所有子节点,可以这样写:
SELECT *
FROM categories
WHERE lft BETWEEN (SELECT lft FROM categories WHERE category_id = 1)
AND (SELECT rgt FROM categories WHERE category_id = 1);
这里通过 BETWEEN 操作符,利用左值和右值的范围,获取指定节点及其所有子节点。
物化路径模型
物化路径模型在表中记录每个节点到根节点的完整路径。例如,categories 表包含 category_id 和 path 字段,path 字段存储以分隔符(如 /)连接的父节点 ID。
查询某个节点及其所有子节点可以通过 LIKE 操作符:
SELECT *
FROM categories
WHERE path LIKE (SELECT path FROM categories WHERE category_id = 1) + '%';
每种方法都有其优缺点。邻接表模型简单直观,适合动态更新树结构;嵌套集模型查询效率高,但更新操作复杂;物化路径模型查询简单,但路径字段可能过长,占用较多空间。在实际应用中,需要根据具体需求和数据特点选择合适的方法来查询树状结构数据。
- 数据库:久分必合,久合必分
- 五步构建含 Serverless 用户身份验证的 React 项目
- 谷歌地图重大更新:AR 导航覆盖室内,机场商场轻松逛
- 23 种 Node.js 在自动化测试中的优秀实践
- 鸿蒙内核源码之原子操作解析:谁在守护?
- 从 Logback 到 Log4j2:我的日志框架新选择
- 死磕 36 个 JS 手写题,大幅提升能力
- 量子计算即将学会推理:新研究发现
- JavaScript 限定输入内容的实现教程
- Vue3.0 新特性与使用经验汇总
- 微服务中分布式锁的正确掌握方法
- 异步 Python 相较于同步 Python 的优势所在
- Vue2.x 双向绑定的原理与实现
- Restful 风格 API 接口的正确编写方式
- Web 前端与测试哪个更好且门槛更低?