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

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

  

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 s
LEFT 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 p
LEFT 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 p
LEFT JOIN tdb_goods_types AS s ON s.parent_id = p.type_id
GROUP BY
p.type_name
ORDER BY
p.type_id ASC;

MySQL技巧(二)——无限级分类表设计的更多相关文章

  1. MySQL之无限级分类表设计

    首先查找一下goods_cates表和table_goods_brands数据表 分别使用命令: root@localhost test>show columns from goods_cate ...

  2. FreeSql 使用 ToTreeList/AsTreeCte 查询无限级分类表

    关于无限级分类 第一种方案: 使用递归算法,也是使用频率最多的,大部分开源程序也是这么处理,不过一般都只用到四级分类. 这种算法的数据库结构设计最为简单.category表中一个字段id,一个字段fi ...

  3. MySql(二)索引的设计与使用

    MySql(二)索引的设计与使用 一.索引概述 二.设计索引的原则 三.BTREE索引与HASH索引 一.索引概述 所有Mysql列类型都可以被索引,对相关列使用索引时提高select操作性能的最佳途 ...

  4. MySQL分类表设计--根据ID删除全部子类

    在做数据库分类表的时候,通常会有这样的设计:一个字段是ID,另一个字段PID,PID指向自己的上级分类: 这样的设计带来的问题是:我要删除一个类,我希望它的子类全部一起删除: 在不知道分类有多少层级的 ...

  5. Java电商支付系统手把手实现(二) - 数据库表设计的最佳实践

    1 数据库设计 1.1 表关系梳理 仔细思考业务关系,得到如下表关系图 1.2 用户表结构 1.3 分类表结构 id=0为根节点,分类其实是树状结构 1.4 商品表结构 注意价格字段的类型为 deci ...

  6. Mysql配置优化,库表设计

    Mysql 服务器参数类型: 基于参数的作用域: 全局参数:set global autocommit = ON/OFF; 会话参数(会话参数不单独设置则会采用全局参数):set session au ...

  7. MySQL树形结构的数据库表设计和查询

    1.邻接表(Adjacency List) 实例:现在有一个要存储一下公司的人员结构,大致层次结构如下: 那么怎么存储这个结构?并且要获取以下信息: 1.查询小天的直接上司. 2.查询老宋管理下的直属 ...

  8. 在mysql数据库中,文章表设计有啥好的思路

    Q: 用mysql设计一张文章表,不知道有啥好的思路! 我是这样的,应为考虑附件和图片,所以我的文章表除了有varchar(1000)的文章内容,还设置了个Bolb接收附件和图片. 我用的是mysql ...

  9. DF学Mysql(二)——数据表的基本操作

    1.创建数据表 先使用“USE <数据库名>”指定在哪个数据库中操作 CREATE TABLE <表名> ( 字段1 数据类型 [列级别约束条件] [默认值], 字段2 数据类 ...

随机推荐

  1. Web browser发展演变

    浏览器是指可以显示网页服务器或者文件系统的HTML文件内容,并让用户与这些文件交互的一种软件.网页浏览器主要通过HTTP协议与网页服务器交互并获取网页,这些网页由URL指定,文件格式通常为HTML.大 ...

  2. 吴恩达机器学习笔记48-降维目标:数据压缩与可视化(Motivation of Dimensionality Reduction : Data Compression & Visualization)

    目标一:数据压缩 除了聚类,还有第二种类型的无监督学习问题称为降维.有几个不同的的原因使你可能想要做降维.一是数据压缩,数据压缩不仅允许我们压缩数据,因而使用较少的计算机内存或磁盘空间,而且它也让我们 ...

  3. 纯小白创建第一个Node程序失败-容易忽略的一个细节

    一直觉得自己基础还很差,所以自觉不敢去碰node.js,但又对其心怀好奇.恰巧最近有一点空闲时间,忍不住去试了一下水   这不,在创建第一个node程序时就吃了闭门羹,总是提示我没有定义,如下图, 这 ...

  4. Python开发网站目录扫描器

    有人问为什么要去扫描网站目录:懂的人自然懂 这个Python脚本的特点: 1.基本完善 2.界面美观(只是画了个图案) 3.可选参数增加了线程数 4.User Agent细节处理 5.多线程显示进度 ...

  5. 神经网络架构PYTORCH-前馈神经网络

    首先要熟悉一下怎么使用PyTorch来实现前馈神经网络吧.为了方便理解,我们这里只拿只有一个隐藏层的前馈神经网络来举例: 一个前馈神经网络的源码和注释如下:比较简单,这里就不多介绍了. class N ...

  6. [原创]k8exe2bat任意文件转Bat工具(WebShell无法上传EXE解决方案)

    http://qqhack8.blog.163.com/blog/static/114147985201126105626755/ 这是我2011年的东西了,当时用此方法可免杀很多马,至今依然有很大的 ...

  7. Spring Boot最核心的27个注解,你了解多少?

    导读 Spring Boot方式的项目开发已经逐步成为Java应用开发领域的主流框架,它不仅可以方便地创建生产级的Spring应用程序,还能轻松地通过一些注解配置与目前比较火热的微服务框架Spring ...

  8. Linux编程 20 shell编程(shell脚本创建,echo显示信息)

    一概述 前面19章里已经掌握了linux系统和命令行的基础知识,从本章开始继续学习shell脚本的基础知识.在大量编辑shell脚本前,先来学习下一些基本概念. 1.1    使用多个命令 Shell ...

  9. mysql 开发进阶篇系列 2 SQL优化(explain分析)

    接着上一篇sql优化来说 1. 定位执行效率较低的sql 语句 通过两种方式可以定位出效率较低的sql 语句. (1) 通过上篇讲的慢日志定位,在mysqld里写一个包含所有执行时间超过 long_q ...

  10. jvm详情——3、JVM基本垃圾回收算法回收策略

    JVM基本垃圾回收算法回收策略 引用计数(Reference Counting):比较古老的回收算法.原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数.垃圾回收时,只用收集计数为0的 ...