MySQL之无限级分类表设计

2023-10-26

首先查找一下goods_cates表和table_goods_brands数据表

分别使用命令:

root@localhost test>show columns from goods_cates;
root@localhost test>select * from goods_cates;


1、无限分级表设计

但这仅仅是示例,远远达不到实际的需求,比如说书籍这个类,在网站上可以搜索到在书籍这个分类下面还有历史,文学,经济等等子类,子类下面还有子类,这种无限分类如何设计呢?理论上可以设计很多张表,随着分类的增多,这些数据表不可能无限扩展,因此可以通过如下设计:

CREATE TABLE table_goods_type(
    type_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
	type_name VARCHAR(20) NOT NULL,
	parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0
);

创建成功之后查看一下

root@localhost test>show columns from table_goods_type;

现在插入若干条记录

INSERT table_goods_type(type_name,parent_id) VALUES ('家用电器',DEFAULT);
INSERT table_goods_type(type_name,parent_id) VALUES ('电脑办公',DEFAULT);
INSERT table_goods_type(type_name,parent_id) VALUES ('大家电',1);
INSERT table_goods_type(type_name,parent_id) VALUES ('生活电器',1);
INSERT table_goods_type(type_name,parent_id) VALUES ('平板电视',3);
INSERT table_goods_type(type_name,parent_id) VALUES ('空调',3);
INSERT table_goods_type(type_name,parent_id) VALUES ('电风扇',4);
INSERT table_goods_type(type_name,parent_id) VALUES ('饮水机',4);
INSERT table_goods_type(type_name,parent_id) VALUES ('电脑整机',2);
INSERT table_goods_type(type_name,parent_id) VALUES ('电脑配件',2);
INSERT table_goods_type(type_name,parent_id) VALUES ('笔记本',9);
INSERT table_goods_type(type_name,parent_id) VALUES ('超极本',9);
INSERT table_goods_type(type_name,parent_id) VALUES ('游戏本',9);
INSERT table_goods_type(type_name,parent_id) VALUES ('CPU',10);
INSERT table_goods_type(type_name,parent_id) VALUES ('主机',10);
 查询一下记录
root@localhost test>select * from table_goods_type;

关于parent_id的说明:

1、parent_id为0,家用电器为顶级结点,意味着就是没有父亲结点,因此就是为0,同电脑办公也是父亲节点

2、大家电作为家用电器的子类,所以其父类为家用电器的type_id,所以写的是1,同生活电器

3、而平板电视属于大家电的子类,因此其parent_id为3,同样饮水机属于生活电器,因此parent_id为4,依次类推

上述的表设计好了之后如何做查找呢?

要做查找的话就需要通过自身连接来实现,所谓自身连接就是数据连接并不是其他数据表,而是自身。

现在想查找所有的子类和其父类,如何操作呢?要是有两张表,可以很容易知道,但是现在一张表怎么实现呢,想象右侧也有一张表,这张表示子表

             

因为子表中的parent_id指向的是父表中的type_id

root@localhost test> SELECT son.type_id,son.type_name,parent.type_name FROM table_goods_type AS son
    -> LEFT JOIN table_goods_type  AS parent
    ->  ON son.parent_id = parent.type_id;

因为家电电器和电脑办公属于顶级分类,因此其没有父类,其它的均可以查找到父类,因为MySQL没有递归查询的能力,因此只能查找到一级分类。既然能查到子类的id(type_id),子类的名字name(type_name)和父类的名字type_name. 

root@localhost test>SELECT parent.type_id,parent.type_name,son.type_name FROM table_goods_type parent LEFT JOIN
    -> table_goods_type son ON son.parent_id  = parent.type_id;

这样就查到了左边和右边两个类,左边是家用电器这个类,其子类有大家电和生活电器,大家电下面有子类平板电视和空调,依次类推,当然像主机、CPU下面就没有子类,所以为NULL。由于左边的父类显示有重复的,这里进行修改

root@localhost test>SELECT parent.type_id,parent.type_name,son.type_name FROM table_goods_type parent LEFT JOIN
    -> table_goods_type son ON son.parent_id  = parent.type_id GROUP BY parent.type_name;

root@localhost test>SELECT parent.type_id,parent.type_name,son.type_name FROM table_goods_type parent LEFT JOIN
    -> table_goods_type son ON son.parent_id  = parent.type_id GROUP BY parent.type_name
    -> ORDER BY parent.type_id;

现在只显示子类的数目,不显示子类的名字

root@localhost test>SELECT parent.type_id,parent.type_name,count(son.type_name) child_count FROM table_goods_type parent LEFT JOIN
    -> table_goods_type son ON son.parent_id  = parent.type_id GROUP BY parent.type_name
    -> ORDER BY parent.type_id;

这样就只显示了子类的数量

2、多表的删除

多表的删除的语法结构是

DELETE table_name[.*] [,table_name[.*]]... FROM table_references [WHERE where_condition]

在表goods中发现有两条重复的记录,分别是honorX6和Laserjet Pro P16重复,可能在有意无意键录入了重复的记录,现在想删除重复的记录,保留goods_id较小的那个,这就是通过多表删除实现,采用一张表模拟两张表的方法实现,首先要查找重复的记录。

root@localhost test>SELECT goods_id,goods_name FROM goods GROUP BY goods_name;

总共11条记录,现在分组筛选之后还有9条,说明重复了2条,但是只想要记录重复(超过两个以上的),因此可以是HAVING

root@localhost test>SELECT goods_id,goods_name FROM goods GROUP BY goods_name HAVING count(goods_name) >= 2;

这两条记录就是重复的,就是需要删除的,因此可以参照这张表删除初始的表goods    

root@localhost test>DELETE t1 FROM goods AS t1 LEFT JOIN (SELECT goods_id,goods_name FROM goods GROUP BY
    -> goods_name HAVING count(goods_name) >= 2) AS t2 ON t1.goods_name = t2.goods_name WHERE t1.goods_id > t2.goods_id;

提示两条记录被删除,再来查看一下表goods



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL之无限级分类表设计 的相关文章

  • Mysql为简单频繁查询创建排序索引性能

    我正在处理一个包含大约 400 万条消息条目的 mysql 表 并尝试根据时间戳选择最新的 50 条消息 另一个要求是返回的消息不以固定前缀开头 问题是单个查询大约占用 25 的 cpu 并且最多需要 1 5 秒 该查询经常由多个客户端执行
  • 从多个表中选择 - 一对多关系

    我有这样的表 表产品 身份证 姓名 表格图像 产品 ID 网址 订单号 表价 产品 ID 组合 货币 价格 表数量 产品 ID 组合 数量 表 Product 与其他表是一对多关系 我需要查询表并得到类似这样的结果 伪数组 ProductI
  • MySql如何通过过滤多列来限制多个数字?

    我想从数据库中获取 4 个不同类别的 50 个问题 我想要 4 个不同类别中每个类别的不同数量的问题 我的结果集必须包含第一类 12 个问题 第二类 20 个问题 第三类 10 个问题和第四类 8 个问题 我的问题表中总共有 50 个问题
  • PHP:使用输入和输出参数(不是“INOUT”)调用 MySQL 存储过程

    我想从 PHP 调用 MySQL 中的存储过程 该过程需要输入and输出参数 not INOUT 参数 举一个简单的例子 假设我在 MySQL 中有以下存储过程 DELIMITER DROP PROCEDURE IF EXISTS test
  • 不唯一的表/别名

    因此 我尝试使用多个联接来运行此查询 以获得我想要的精确行 但我不断收到此错误 不唯一的表 别名 ss prices 我正在运行的查询 select ss accounts id ss accounts bot acc id ss acco
  • 为什么 sql 字段名称中不应该包含逗号?

    人们一直告诉我列名中不应包含空格 我只是想知道 这是为什么 这是我为学校创建的一些数据库表遇到的问题 字段名称包括 Preble 和 Darke 相反 它们需要是 普雷布尔县 俄亥俄州 和 达克县 俄亥俄州 如果它们是行名称 我只需创建一个
  • UNIX时间记录时区吗?

    我想问一下UNIX时间 UNIX时间是否记录时区 我将托管从美国芝加哥移至 JST 问题是我的整个 MySQL 数据库都有 UNIX 时间 芝加哥 美国时区 的记录 我有一个 PHP 代码来显示之前的时间 例如 3 天前 昨天等 当我搬到新
  • MySQL中是否有类似Oracle中“level”的函数[重复]

    这个问题在这里已经有答案了 我面临一个场景 如果输入是 10 我想要一个数字序列 1 2 3 10 在甲骨文中levelfunction 提供了该功能 我想知道如何在 MySQL 中执行相同的任务 谢谢 您可以在 mysql 中使用此查询
  • 使用 pip3 安装 mysqlclient 时遇到问题

    我正在尝试使用 Django 设置 python 3 6 环境 安装说明说我应该安装 mysqlclient 才能连接到 mySQL 我明白了 dennis django sudo H pip3 install mysqlclient Co
  • MySQL 错误 1290 (HY000) --secure-file-priv 选项

    我试图在我的脚本中使用以下代码将 MySQL 脚本的结果写入文本文件 SELECT p title p content c name FROM post p LEFT JOIN category c ON p category id c i
  • 使用 PHP 代码和 HTML 表单将 Excel (.csv) 导入 MySQL

    我知道还有其他类似的帖子 但每个人都建议直接在 PHPMyAdmin 中将其导入 MySQL 这工作完美 但我需要通过 HTML 表单导入 PHP 到 MySQL 我想要一个收集文件的 HTML 表单 然后将该文件传递给 PHP 脚本 我想
  • 如何使用 PHP 从 MySQL 查询中按升序对值进行排序?

    我使用以下 PHP 脚本从 MySQL 表中获取和更改数据 并将结果打印在 HTML 表中 我希望按升序对数据进行排序 utilization percentage变量 它是由创建的 total client time total avai
  • MySQL 中的断言

    我有一个针对大型数据库运行的 SQL 脚本 我想在开始时提出几个简单的查询 作为健全性检查 有没有办法在MySQL中写断言 或者任何类型的 选择 如果它与该值不匹配 则中止整个脚本 一些疯狂的代码 要点是 SET可能会引发 mysql 变量
  • 从数据库生成 XML 时出现 PHP 编码错误 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试获取一个简单的 PHP 服
  • 选择MySql表数据放入数组中

    我尝试从 mysql 捕获数据并将它们全部放入数组中 认为 users table id name code 1 gorge 2132 2 flix ksd02 3 jasmen skaod2 sql mysql query select
  • SQL 大表中的随机行(使用 where 子句)

    我有一个网站 人们可以在其中对汽车进行投票 向用户展示 4 辆汽车 他 她可以投票选出他们最喜欢的汽车 桌子cars有重要的列 car id int 10 not auto increment so has gaps views int 7
  • PDO::commit() 成功或失败

    The PHP PDO 提交 http www php net manual en pdo commit php文档指出该方法成功时返回 TRUE 失败时返回 FALSE 这是指beginTransaction 和commit 之间的语句执
  • 使用MySQL计算单个表中借方和贷方的余额

    下面的 MySQL 表包含带有关联金额的借方或贷方 操作 如何选择具有非零 余额 的所有 CLIENT ID 我尝试将表连接到自身以计算所有借方和贷方总额 但有些东西无法正常工作 CLIENT ID ACTION TYPE ACTION A
  • 如何修复 InterfaceError: 2003: 无法连接到“127.0.0.1:3306:3306”上的 MySQL 服务器(11001 getaddrinfo 失败)

    我的MySQL连接成功但是遇到这个界面错误 import mysql connector db mysql connector connect host 127 0 0 1 3306 user root passwd teja databa
  • 如何使用 PHP 从 MySQL 检索特定值?

    好吧 我已经厌倦了 过去一周我花了大部分空闲时间试图解决这个问题 我知道 SQL 中的查询已更改 但我无法弄清楚 我能找到的所有其他帖子似乎都已经过时了 如果有人能帮助我 我将非常感激 我想做的就是使用手动输入数据库的唯一 密码 来检索行的

随机推荐

  • POJ 1811 Prime Test —— Miller_Rabin+Pollard_Rho

    http poj org problem id 1811 题意 给定一个64位整数 问是否为质数 如果不是 则输出其最小因子 分析 Miller Rabin素数判定 若不是 则Pollard Rho分解质因子 找到最小即可 Miller r
  • 【对比Java学Kotlin】作用域函数

    什么是作用域函数 首先 落脚点是函数 什么的函数呢 能在某个上下文对象 可能是普通对象 也可能是个 Unit 的作用域内执行代码的函数 这里的作用域和 Java 的作用域有所不同 Java 的作用域更多的是指一对闭合的 的内部区域 void
  • Oracle数据库环境变量配置+修改数据库密码

    1 设置环境变量 必须设置环境变量才可以用CMD命令访问Oracle数据库 1 1 首先找到你Oracle安装位置路径 C app Administrator product 11 2 0 dbhome 1 1 2 设置环境变量 1 2 1
  • RAM汇编指令的简单介绍

    一些常见的概念 指令和伪指令 指令和伪指令的本质区别 指令在编译后会生成机器码由CPU去执行 而伪指令只是指导编译的过程 本身不会生成机器码 伪指令是编译器提供的 在编译的过程中 编译器自己会去对伪指令做相应的处理 什么是汇编指令 汇编指令
  • mysql installer no packages found 解决办法

    mysql installer no packages found 解决办法 方法源于https stackoverflow com questions 65772865 mysql installer did not find packa
  • 网络层协议和IP数据包的格式(详解)

    1 网络层的功能 定义了基于IP协议的逻辑地址 就是ip地址 连接不同的媒介类型 选择数据通过网络的最佳路径 完成逻辑地址寻址 2 IP数据包格式 版本号 Version 4bit 指IP协议版本 并且通信双方使用的版本必须保持一致 目前我
  • chatGPT是什么?chatGPT有哪些应用场景

    ChatGPT是一个通过大规模预训练语言模型实现的对话生成系统 它是由OpenAI研发的 这个系统的核心技术是基于深度学习的自然语言处理技术 GPT GenerativePre trainedTransformer 模型 GPT模型采用了T
  • uni-app中的#ifdef #ifndef #endif的用处,可以处理兼容多端平台

    1 ifdef ifndef endif三者的意思 ifdef 仅在某个平台上使用 ifndef 在除了这个平台的其他平台上使用 非此平台使用 endif 结束条件编译 2 平台标识的意思 标识 平台 APP PLUS 5 App MP 微
  • 关于vmware虚拟机的deepin没有网络问题

    首先我的vmware虚拟机的deepin是采用NAT模式 配置NAT网络 配置VMnet8 在deepin中手动添加有线连接 添加设置 保存退出 用有线连接2即可
  • 微信小程序实践——实验2天气查询小程序

    一 申请和风天气的API密钥 登录和风天气 创建成功后可得到自己的key 二 域名的配置 每一个小程序在与指定域名地址进行网络通信前都必须将该域名地址添加到管理员后台白名单中 需对域名地址https devapi qweather com进
  • Search for a Range(LeetCode)

    Given an array of integers nums sorted in ascending order find the starting and ending position of a given target value
  • 【python】爬虫篇:python使用psycopg2批量插入数据(三)

    本人菜鸡 有什么错误 还望大家批评指出 最近在更新python的爬虫系列 皿 Hiahiahia 该系列暂时总共有3篇文章 连接如下 python 爬虫篇 python连接postgresql 一 https blog csdn net l
  • 查看系统使用率命令 vmstat 输出详解!

    使用效果
  • 凸包问题的五种解法

    原文 http blog csdn net yangkunpengd article details 51336453 凸包问题的五种解法 前言 首先 什么是凸包 说凸包首先要说凸性的定义 简单点说就是平面邻域中任意两点所在的线段上的点都在
  • LR(0)文法分析(通过例题穿插讲解)

    目录 LR 0 文法的字面含义 LR 0 分析表的构造 写在最后 LR 0 文法的字面含义 LR 0 分析法是其他LR分析法构造的基础 L表示从左往右扫描 R表示反向构造出一个最右推导 k表示向前看k个字符 缺省为1 在学习LR 0 分析时
  • Linux驱动框架与LED实战

    目录 驱动框架 相关文件 案例分析 LED驱动框架源码 led class c led class attrs leds class class结构体 led classdev register 某一类的设备创建 led classdev结
  • QT获取显示当前时间和日期

    获取当前时间和日期 QT中获取时间和日期的主要是 QTime QDate 和 QDateTime 这三个类 QTime 类 通过 QTime 类中提供的时间相关的方法 可以获取到当前系统时间 时 分 秒 毫秒 需要注意的是 计时的准确性由底
  • QWidget/QDialog主窗体设置边框圆角

    1 问题 QT中窗体QWidget和QDialog为容器 不能对窗体进行边框圆角样式改变 只能通过绘图QPainter 2 设置无上边框选项窗口 this gt setWindowFlags Qt Widget Qt FramelessWi
  • CSS学习笔记八——宽高自适应

    宽高自适应 一 宽度自适应 二 高度自适应 三 浮动元素的高度自适应 四 窗口自适应 五 结语 一 宽度自适应 不写宽度或者写 width auto就表示宽度自适应 可用于横栏或导航栏 与 width 100 不同 设为100 已经固定了宽
  • MySQL之无限级分类表设计

    首先查找一下goods cates表和table goods brands数据表 分别使用命令 root localhost test gt show columns from goods cates root localhost test