MySQL 一条语句递归,轻松实现无限级分类(mysql 一条语句递归)
使用 MySQL 一条语句递归,轻松实现无限级分类
在网站开发中,无限级分类常常被使用。无论是电商网站的商品分类、新闻网站的信息分类,还是博客网站的标签分类,都需要用到无限级分类。
但是,怎么实现一个高效的无限级分类呢? MySQL 一条语句递归就是一个值得推荐的方案。这个方法非常简单,只需要一条 SQL 语句就可以完成无限级分类的查询。
下面我们就来看一下怎么实现吧!
我们需要创建一个 category 表,用来存储分类信息。
“`SQL
CREATE TABLE category (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
parent_id INT DEFAULT NULL,
INDEX(parent_id),
FOREIGN KEY (parent_id) REFERENCES category(id) ON DELETE CASCADE
) ENGINE=InnoDB;
这里,我们使用了 InnoDB 引擎,创建了一个包含 id、name 和 parent_id 列的表。其中,id 是自增主键,name 是分类名,parent_id 是该分类的父级分类 ID,这个字段允许为空,表示该分类是一级分类。
为了实现无限级分类,我们需要使用 parent_id 来保存分类之间的关系。并且建立 FOREIGN KEY 和 INDEX 以优化查询。
现在,我们可以往 category 表中插入一些数据,来模拟真实的分类数据。
```SQLINSERT INTO category (name, parent_id) VALUES
('云计算', NULL),('AWS', 1),
('Azure', 1),('GCP', 1),
('AWS EC2', 2),('AWS S3', 2),
('Azure Blob Storage', 3),('Azure Cosmos DB', 3),
('Google Cloud Storage', 4),('Google Cloud Compute Engine', 4),
('Google Cloud SQL', 4),('Google Kubernetes Engine', 4);
现在,我们来实现一个 SQL 语句,通过递归的方式,查询出所有一级分类以及其下的所有子分类。
“`SQL
WITH RECURSIVE category_path (id, path) AS (
SELECT id, name FROM category WHERE parent_id IS NULL
UNION ALL
SELECT c.id, CONCAT(cp.path, ‘ > ‘, c.name)
FROM category AS c JOIN category_path AS cp ON c.parent_id = cp.id
) SELECT * FROM category_path ORDER BY path;
这个 SQL 语句的关键是 WITH RECURSIVE 子句。这个子句定义了一个公共表达式,用来递归地查询子分类。
我们查询出所有 parent_id 为 NULL 的分类,也就是一级分类。然后,我们使用 UNION ALL 操作符将结果集连接到 category_path 表中。
在第二部分中,我们将 category 表连接到 category_path 表中,以查询每个分类的子分类。这个过程使用了 JOIN 操作符和 ON 子句。我们使用 CONCAT 函数将所有的分类名称连接成路径。
我们查询 category_path 表中的所有行,并按路径进行排序。这个语句就可以返回类似下面的结果:
+—-+——————–+
| id | path |
+—-+——————–+
| 1 | 云计算 |
| 2 | 云计算 > AWS |
| 5 | 云计算 > AWS > EC2 |
| 6 | 云计算 > AWS > S3 |
| 3 | 云计算 > Azure |
| 7 | 云计算 > Azure > Blob Storage |
| 8 | 云计算 > Azure > Cosmos DB |
| 4 | 云计算 > GCP |
| 9 | 云计算 > GCP > Google Cloud Storage |
| 10 | 云计算 > GCP > Google Cloud Compute Engine |
| 11 | 云计算 > GCP > Google Cloud SQL |
| 12 | 云计算 > GCP > Google Kubernetes Engine |
+—-+——————–+
现在,我们已经成功地使用一条 SQL 语句实现了无限级分类查询。这个方法非常简单、高效,而且可以轻松应对大规模数据的分类查询。如果你在开发中遇到了无限级分类需求,不妨一试这个方法吧。