MySQL之无限级分类表设计 |
您所在的位置:网站首页 › 民宿分级分类表 › MySQL之无限级分类表设计 |
首先查找一下goods_cates表和table_goods_brands数据表 分别使用命令: root@localhost test>show columns from goods_cates; root@localhost test>select * from goods_cates;但这仅仅是示例,远远达不到实际的需求,比如说书籍这个类,在网站上可以搜索到在书籍这个分类下面还有历史,文学,经济等等子类,子类下面还有子类,这种无限分类如何设计呢?理论上可以设计很多张表,随着分类的增多,这些数据表不可能无限扩展,因此可以通过如下设计: 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,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 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |