MySQL技巧(二)——无限级分类表设计

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

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

  

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;

原文地址:https://www.cnblogs.com/deepSleeping/p/9938500.html

时间: 2024-10-06 01:19:36

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

MySQL基础入门学习【9】无限级分类表设计

比如: 图书/小说.文学.../四大名著.戏曲.../... 理论上可以设计很多张表: 但是随着分类逐步增多,这些表的数目不可能无限扩展: 所以对于无限级分类表一般我们采用如下形式(通过自身的连接来实现的): 这个例子中我们至少设计三个字段: 分类的id.分类的名称.父类的id. 插入记录: INSERT tdb_goods_types(type_name,parent_id) VALUES('家用电器',DEFAULT); INSERT tdb_goods_types(type_name,pa

MYSQL无限级分类表设计及自我连接

我们有这样一个需求: 做一个城市联动,比如说贵州省,省下面有众多市,市下面有众多区县,区县下面有众多镇,如果用多张表来存储,必然是能够简单的实现联动效果,但是多表的联合查询必然会影响到一些效率,此时可以考虑 用一张表来实现. 还有当我们要分的级数是不确定的,或者是很多的,那么建立多张表也是不合理的设计. 如何用一张表来存储呢? 该表的建立代码如下: 1 create table city(id smallint unsigned auto_increment primary key, 2 cit

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

1 数据库设计 1.1 表关系梳理 仔细思考业务关系,得到如下表关系图 1.2 用户表结构 1.3 分类表结构 id=0为根节点,分类其实是树状结构 1.4 商品表结构 注意价格字段的类型为 decimal 1.5 支付信息表结构 1.6 订单表结构 乍一看,有必要搞这么多种的时间嘛?有以下诸多原因 前端显示需要,那就必须存着呀! 方便定位排查问题,比如某用户投诉某订单一直不发货,肯定就需要时间去定位 方便数据分析,比如需要计算从用户支付到最终发出商品的平均时间 根据订单状态确认相应订单时间 1

Mysql配置优化,库表设计

Mysql 服务器参数类型: 基于参数的作用域: 全局参数:set global autocommit = ON/OFF; 会话参数(会话参数不单独设置则会采用全局参数):set session autocommit = ON/OFF; 注意:全局参数的设定对于已经存在的会话无法生效,会话参数的设定随着会话的销毁而失效全局类的统一配置建议配置在默认配置文件中,否则重启服务会导致配置失效. 寻找配置文件不迷路: mysql --help 寻找配置文件的位置和加载顺序 Default options

MySQL学习16:多表连接

一连接概述 (1)连接 MySQL数据库在SELECT语句,多表更新以及多表删除中都支持JOIN操作.多表连接的语法结构为: table_reference {[INNER | CROSS] JOIN} | {LEFT|RIGHT} [OUTER] JOIN} table_reference ON condtional_expr; (2)数据表参照 table_reference table_name [[AS] alias] | table_subquery [AS] alias 数据表可以使

mysql无限级分类实现基于汇报关系的信息管理权限

汇报关系和家族族谱的实现类似,采用树的数据结构进行定义,树采用递归进行定义.即要嘛是一个根节点,要嘛是由一个根节点和其子树组成.OA中的汇报关系也采用这种结构(与树稍有不同),除董事长外,其他人有且只有一个非其本人的直接主管,董事长的直接主管和越级主管是其本人.从以上的定义其实可以看出,汇报关系类似树,但又与树并不完全相同.除董事长外,其他汇报关系均是树形结构.树形结构采用递归定义,如采用递归查询是非常耗时的操作.比如以下需求: 1.主管可以看到所有直线下属的绩效信息: 针对以上需求,我们提出三

MySQL的多表设计

一.外键约束 保证数据的完整性. 定义外键约束: 可以直接在create语句中定义外键 foreign key 当前表名(字段名) references 目标表名(目标表的主键) 创建完语句后,可以直接使用修改语句定义 alter table 表名 add foreign key 当前表名 (字段名) references 目标表名(目标表的主键) 二.多表设计的三种实体关系 多对多.一对多和一对一 三.多表设计之---------一对多 一个班级可以有多个学生,但是一个学生只能属于一个班级.或

mysql 给axel数据创建表

create table point( id int primary key auto_increment ,point_x double, point_y double, boundry bool ); 一.sql语句 1.操作数据库 (1)创建数据库 CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification:    [DEFA

PHP利用递归函数实现无限级分类的方法_php技巧 - PHP

文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 相信很多学php的很多小伙伴都会尝试做一个网上商城作为提升自己技术的一种途径.各种对商品分类,商品名之类的操作应该是得心应手,那么就可以尝试下无限级分类列表的制作了. 什么是无限级分类? 无限级分类是一种分类技巧,例如部门组织,文章分类,学科分类等常用到无限级分类,将其简单理解成分类就好了.其实我们仔细想一下,生活中的分类简直太多了,衣服可以分为男装和女装,也可以分为上衣和裤子,也可以根据年龄段分类.分类无处不在,分