博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL技巧(二)——无限级分类表设计
阅读量:7011 次
发布时间:2019-06-28

本文共 2402 字,大约阅读时间需要 8 分钟。

无限级分类表的设计(掌握'自身连接')

类似图书这种,会有很多种分类,而且在现实生活中这种分类会无限的往下分,所以不可能每有一个分类就创建一个分类表。应该使用下面这种语句

  

DROP TABLE IF EXISTS tdb_goods_types;CREATE TABLE tdb_goods_types(        type_id            SMALLINT  PRIMARY KEY AUTO_INCREMENT COMMENT '分类ID',        type_name        VARCHAR(50)                COMMENT '分类名称',            parent_id          SMALLINT   NOT NULL DEFAULT 0     COMMENT '父类ID');

然后再模拟图书类的分类来个小demo

INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('电子书',DEFAULT);INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('文学',1);INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('影视原著',2);INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('中外名著',2);INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('漫画杂志',2);INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('文学',2);INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('小说',2);INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('传记',2);INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('经管',1);INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('金融投资',9);INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('市场营销',9);INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('管理学',9);INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('职场进阶',9);INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('科学新知',1);INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('人工智能',14);INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('电子商务',14);INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('大数据',14);INSERT INTO tdb_goods_types(type_name,parent_id) VALUES('科普',14);

 

 从下图中很容易可以看到,'电子书'为顶级分类,所以parent_id为0,以此类推....

这时候我们需要查询具体分类以及对应父类,我们就需要假想有两张相同的表,一张是父表(parent),一张是子表(son),自己连接自己查询,子表的parent_id = 父表的type_id,子表中的type_name就是子类分类,父表中的type_name就是父类分类名称

SELECT    s.type_id AS 分类编号,    s.type_name AS 分类名称,    p.type_name AS 父类名称FROM    tdb_goods_types AS sLEFT JOIN tdb_goods_types AS p ON s.parent_id = p.type_id;

 

也可以用另一种思路,查看父类,以及对应的子类

SELECT    p.type_id AS 分类编号,    p.type_name AS 父类名称,    s.type_name AS 子类名称FROM    tdb_goods_types AS pLEFT JOIN tdb_goods_types AS s ON s.parent_id = p.type_id;

 

改进:获取的是子类的数量

 

SELECT    p.type_id AS 分类编号,    p.type_name AS 父类名称,    COUNT(s.type_name) AS 子类数目FROM    tdb_goods_types AS pLEFT JOIN tdb_goods_types AS s ON s.parent_id = p.type_idGROUP BY    p.type_nameORDER BY    p.type_id ASC;

 

转载于:https://www.cnblogs.com/deepSleeping/p/9938500.html

你可能感兴趣的文章
在ECSHOP商品列表页和搜索页面,最后出现空商品的解决办法
查看>>
ubuntu14.04 安装配置hadoop2.6
查看>>
MySQL5.6.25修改字符编码和max_allowed_packet
查看>>
大企业或中小企业:我们都需要21世纪的数据安全
查看>>
samba服务的参数public和browseable的区别
查看>>
Linux-MySQL-常用sql语句
查看>>
学习二十五
查看>>
搭建 Marathon+Mesos+Docker 架构
查看>>
lvs调度算法
查看>>
学界 !李飞飞高徒Andrej Karpathy提醒你,小心搭建神经网络的六个坑
查看>>
CSS3中resize
查看>>
ECM(Electret Condenser Microphone)驻极体电容式麦克风的简称。
查看>>
Git 命令操作
查看>>
Python简介和入门
查看>>
人工智能会取代人类的艺术创造力吗
查看>>
CentOS7,MySQL主从配置和读写分离(MySQL主从、MySQL读写分离、MySQL分布式、数据库读写分离、主从配置)(亲测)...
查看>>
蛋花花揭秘web前端一般会工作到多少岁
查看>>
mysql_replication(主从复制)
查看>>
收到折扇礼物开心~~
查看>>
Java多线程知识点整理(线程间通信)
查看>>