MySQL 实现三级分类的排序
在许多业务场景中,我们需要对商品等数据进行分类展示,而分类的级别一般是三级,即大分类、中分类、小分类。而且,我们也需要对这些分类进行排序,以便更好地呈现给用户。那么,如何使用 MySQL 实现三级分类的排序呢?
1. 数据库设计
我们需要设计好相关的数据库表结构。这里,我们以商品分类为例,分别设计大分类表、中分类表、小分类表和商品表。其中,大分类表和中分类表需要记录各自的 id、名称和排序值,而小分类表还需要记录所属的大分类和中分类的 id。
大分类表:
“`sql
CREATE TABLE `category_big` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘id’,
`name` varchar(50) NOT NULL DEFAULT ” COMMENT ‘名称’,
`sort` tinyint(3) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘排序’,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’大分类表’;
中分类表:
```sql
CREATE TABLE `category_mid` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT \'id\',
`name` varchar(50) NOT NULL DEFAULT \'\' COMMENT \'名称\',
`sort` tinyint(3) unsigned NOT NULL DEFAULT \'0\' COMMENT \'排序\',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=\'中分类表\';
小分类表:
“`sql
CREATE TABLE `category_small` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘id’,
`name` varchar(50) NOT NULL DEFAULT ” COMMENT ‘名称’,
`sort` tinyint(3) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘排序’,
`big_id` int(10) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘所属大分类id’,
`mid_id` int(10) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘所属中分类id’,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’小分类表’;
商品表:
```sql
CREATE TABLE `product` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT \'id\',
`name` varchar(50) NOT NULL DEFAULT \'\' COMMENT \'名称\',
`price` decimal(10,2) unsigned NOT NULL DEFAULT \'0.00\' COMMENT \'价格\',
`small_id` int(10) unsigned NOT NULL DEFAULT \'0\' COMMENT \'所属小分类id\',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=\'商品表\';
2. 数据的插入
然后,我们需要向数据库中插入一些测试数据,以便对排序功能进行测试。
插入大分类数据:
“`sql
INSERT INTO category_big (name, sort) VALUES
(‘数码产品’, 1),
(‘家用电器’, 2),
(‘服饰鞋包’, 3),
(‘美妆个护’, 4),
(‘生活用品’, 5);
插入中分类数据:
```sql
INSERT INTO category_mid (name, sort) VALUES
(\'手机\', 1),
(\'电脑\', 2),
(\'电视\', 3),
(\'厨卫电器\', 4),
(\'家居家纺\', 5),
(\'女装\', 6),
(\'男装\', 7),
(\'童装\', 8),
(\'彩妆\', 9),
(\'护肤品\', 10),
(\'洗护用品\', 11),
(\'厨房餐具\', 12),
(\'家居日用\', 13),
(\'办公用品\', 14);
插入小分类数据:
“`sql
INSERT INTO category_small (name, sort, big_id, mid_id) VALUES
(‘智能手机’, 1, 1, 1),
(‘平板电脑’, 2, 2, 2),
(‘智能电视’, 3, 2, 3),
(‘电磁炉’, 4, 2, 4),
(‘沙发’, 5, 3, 5),
(‘连衣裙’, 6, 3, 6),
(‘皮鞋’, 7, 3, 7),
(‘童车’, 8, 3, 8),
(‘口红’, 9, 4, 9),
(‘乳液’, 10, 4, 10),
(‘洗发水’, 11, 4, 11),
(‘碗筷套装’, 12, 5, 12),
(‘晾衣架’, 13, 5, 13),
(‘复印纸’, 14, 5, 14);
插入商品数据:
```sql
INSERT INTO product (name, price, small_id) VALUES
(\'小米11\', 3999, 1),
(\'华为MatePad Pro\', 4499, 2),
(\'TCL 75吋电视\', 6999, 3),
(\'博朗电磁炉\', 799, 4),
(\'北欧简约沙发\', 2699, 5),
(\'法式蕾丝连衣裙\', 689, 6),
(\'休闲男士皮鞋\', 389, 7),
(\'哈雷电动童车\', 1999, 8),
(\'迪奥口红\', 299, 9),
(\'兰蔻小黑瓶精华液\', 799, 10),
(\'海飞丝洗发露\', 29.9, 11),
(\'万家一笑碗筷套装\', 99, 12),
(\'欧式晾衣架\', 299, 13),
(\'爱好者文具套装\', 49.9, 14);
3. 数据的查询
我们来看一下如何使用 MySQL 对商品进行按分类排序的查询。
查询大分类、中分类和小分类,按照其排序字段升序排列:
“`sql
SELECT b.id AS big_id, b.name AS big_name, m.id AS mid_id, m.name AS mid_name, s.id AS small_id, s.name AS small_name
FROM category_big b
LEFT JOIN category_mid m ON b.id = m.big_id
LEFT JOIN category_small s ON m.id = s.mid_id
ORDER BY b.sort ASC, m.sort ASC, s.sort ASC;
查询属于某个大分类的商品,按照小分类的排序字段升序排列:
```sql
SELECT p.id, p.name, p.price, s.id AS small_id, s.name AS small_name
FROM product p
LEFT JOIN category_small s ON p.small_id = s.id
LEFT JOIN category_mid m ON s.mid_id = m.id
WHERE s.big_id = 1
ORDER BY s.sort ASC;
以上即是 MySQL 实现三级分类的排序的完整流程。通过合理设计数据库表结构和编写 SQL 查询语句,我们可以方便地对商品等数据进行分类展示,并按照指定的排序字段进行排列。