MySQL 获取所有父节点
引言
在关系型数据库中,经常会遇到需要获取一个节点及其所有父节点的需求,例如在商品分类中,需要获取某个商品所属的所有分类,包括其父分类、父父分类等等。在MySQL中,可以通过使用递归查询的方式来实现这一需求。本文将为您介绍如何使用MySQL来获取所有父节点,并提供相应的代码示例。
递归查询的原理
递归查询是一种通过反复应用相同的查询操作来解决问题的方法。在MySQL中,可以使用[联接](
在本文中,我们将使用递归公用表达式来实现递归查询。递归公用表达式使用WITH RECURSIVE
关键字来定义,并由两部分组成:递归查询和终止条件。
递归查询部分定义了一个初始的查询,以及一个递归式。初始查询用于获取初始节点,递归式则通过联接前一次查询的结果来获取下一层节点。递归式中的联接条件通常是通过节点的关系字段来实现。
终止条件用于定义递归查询的结束条件,当满足终止条件时,递归查询将停止。通常,终止条件是根据节点的某个特定属性进行判断的。
示例场景
为了更好地说明如何获取所有父节点,我们将创建一个示例场景:一个商品分类表(categories),该表包含了每个分类的ID、名称和父分类ID。我们需要获取某个商品所属的所有分类,包括其父分类、父父分类等等。
首先,我们需要创建一个商品分类表,并插入一些数据用于演示:
CREATE TABLE categories (
id INT PRIMARY KEY,
name VARCHAR(100),
parent_id INT
);
INSERT INTO categories VALUES (1, '电子产品', NULL);
INSERT INTO categories VALUES (2, '手机', 1);
INSERT INTO categories VALUES (3, '平板电脑', 1);
INSERT INTO categories VALUES (4, '笔记本电脑', 3);
INSERT INTO categories VALUES (5, '家用电器', NULL);
INSERT INTO categories VALUES (6, '冰箱', 5);
INSERT INTO categories VALUES (7, '洗衣机', 5);
现在我们已经创建了一个包含了商品分类数据的表。
获取所有父节点的查询语句
下面是一个获取某个商品所属的所有分类的查询语句。假设我们要获取商品分类ID为4的商品所属的所有分类:
WITH RECURSIVE category_tree AS (
SELECT id, name, parent_id FROM categories WHERE id = 4
UNION ALL
SELECT c.id, c.name, c.parent_id FROM categories c
JOIN category_tree p ON p.parent_id = c.id
)
SELECT * FROM category_tree;
让我们逐步解析这个查询语句:
WITH RECURSIVE category_tree AS (...)
: 定义递归公用表达式的名称为category_tree
。SELECT id, name, parent_id FROM categories WHERE id = 4
: 初始查询,获取商品分类ID为4的商品分类。UNION ALL
: 将初始查询的结果与递归式的结果合并。SELECT c.id, c.name, c.parent_id FROM categories c JOIN category_tree p ON p.parent_id = c.id
: 递归式,通过联接上一次查询的结果来获取下一层节点。SELECT * FROM category_tree
: 查询递归公用表达式的结果。
执行查询并获取所有父节点
为了执行上述查询并获取所有父节点,我们可以使用MySQL的客户端工具,如[MySQL Shell]( Workbench](
让我们使用MySQL Shell来执行查询,并获取商品分类ID为4的商品所属的所有分类: