无限分类:MySQL 查询实现(mysql无限分类查询)
无限分类是一种灵活的用于组织、按照多级层次结构来储存数据的技术,可以应用于类目、文章列表等多种场景。本文重点介绍如何使用MySQL来实现无限分类,以及针对无限分类的查询。
实现无限分类有两种常用方案,其中第一种是使用Adjacency List Model,即关联列表模型,用两列来存储分类信息,分别代表父ID和分类ID。第二种是使用Nested Set Model,即嵌套集模型,需要使用三列来存储分类信息,分别为父ID、左值和右值。
以下是关联列表模型的MySQL结构和查询实现:
“`sql
CREATE TABLE IF NOT EXISTS node (
id INT AUTO_INCREMENT,
pid INT DEFAULT 0,
node_name VARCHAR(50) NOT NULL,
PRIMARY KEY ( id )
);
INSERT INTO node (pid, node_name) VALUES (0, ‘Parent Node 0’);
INSERT INTO node (pid, node_name) VALUES (1, ‘Child Node 0’);
INSERT INTO node (pid, node_name) VALUES (1, ‘Child Node 1’);
INSERT INTO node (pid, node_name) VALUES (2, ‘Grand Child Node 0’);
— 查询顶级类
SELECT * FROM node WHERE pid=0;
— 查询二级子类
SELECT * FROM node WHERE pid=1;
— 查询所有子类
SELECT * FROM node WHERE pid > 0;
— 查询子类和孙子类
SELECT * FROM node WHERE pid > 0 OR pid IN (SELECT id FROM node WHERE pid > 0);
实现嵌套集模型的MySQL结构和查询实现如下:
```sqlCREATE TABLE IF NOT EXISTS node (
id INT AUTO_INCREMENT, pid INT DEFAULT 0,
lft INT, rgt INT,
node_name VARCHAR(50) NOT NULL, PRIMARY KEY ( id )
);-- 手动设置左右值,跟Adjacency List Model的实现类似
INSERT INTO node (pid, lft, rgt, node_name) VALUES (0, 1, 8, 'Root Node 0');INSERT INTO node (pid, lft, rgt, node_name) VALUES (1, 2, 5, 'Parent Node 0');
INSERT INTO node (pid, lft, rgt, node_name) VALUES (2, 3, 4, 'Child Node 0');INSERT INTO node (pid, lft, rgt, node_name) VALUES (3, 6, 7, 'Grand Child Node 0');
-- 查询顶级类SELECT * FROM node WHERE lft=1;
-- 查询二级子类SELECT * FROM node WHERE lft > 1 AND lft
-- 查询所有子孙类SELECT * FROM node WHERE lft > 1;
在查询期间,同时支持关联列表模型和嵌套集模型对无限分类的查询,但推荐使用嵌套集模型,因为它的查询接口更加简洁,可以同步实现查找和求节点个数的功能。
总之,通过 MySQL,使用关联列表模型和嵌套集模型,我们可以实现无限分类的储存和查询功能,进一步满足应用的各种业务需求。