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

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

  

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. 【福州活动】| "福州首届.NET开源社区线下技术交流会"(2018.11.10)

    活动介绍 微软爱开源,已是尽人皆知的事实.自从收购全球最大的开源社区 GitHub 之后,微软依旧使 GitHub 保持独立运营,并且通过此项举措,微软本身已经成为最大的社区服务者. .NET Cor ...

  2. winform复制文件到指定目录

    执行步骤 弹出选择对话框:var openFileDialog = new OpenFileDialog(); 设置选择内容,如所有图片:openFileDialog.Filter="图像文 ...

  3. Java中线程同步锁和互斥锁有啥区别?看完你还是一脸懵逼?

    首先不要钻概念牛角尖,这样没意义. 也许java语法层面包装成了sycnchronized或者明确的XXXLock,但是底层都是一样的.无非就是哪种写起来方便而已. 锁就是锁而已,避免多个线程对同一个 ...

  4. JDK设计模式之——责任链(Filter)

    责任链的设计模式可以参考Servlet的FilterChain.FilterChain中的每个Filter(过滤器)就像一个个的链条 web开发中 有时候需要对接口request和response进行 ...

  5. Mysql基本查询、视图、索引、触发器

    基本查询 1.修改String sql="update smbms_user set userCode=?,userName=? where id=?"; 2.删除用户String ...

  6. 使用idea配置tomcat将web项目跑起来

    链接:https://www.cnblogs.com/avivaye/p/6437555.html

  7. 转转RN工程化历程

    选型RN理由? 目前各大公司技术栈都是native端(android,iOS)以及H5端,然而这两大传统的开发方式都各有优缺点,下面表格简单汇总一下. - native端 web端 RN 开发效率 低 ...

  8. 今日头条面试题——LRU原理和Redis实现

    很久前参加过今日头条的面试,遇到一个题,目前半部分是如何实现 LRU,后半部分是 Redis 中如何实现 LRU. 我的第一反应应该是内存不够的场景下,淘汰旧内容的策略.LRU ... Least R ...

  9. 解决transition动画与display冲突的几种方法

    如demo(如果没有显示,请查看源地址http://jsfiddle.net/ihardcoder/HNduT/2/)所示,基本的效果是在点击“Translate”按钮后,蓝色区域透明度变为0,然后隐 ...

  10. 搞懂ES6的import export

    引言 说来惭愧,这两个关键字几乎天天在写,但是自己写的模块export出去的对象,import居然拿不到,也是没谁了