欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MySQL无限极分类表设计与查询讲解

程序员文章站 2023-01-23 23:09:11
What 举个简单的例子,我们设计购物商城之类的网站的时候一般商品都会有一级分类二级分类甚至三级分类或者再细分,如果按照传统思维我们可能会为每个级别的类别设置一张分类表然后再用外...

What

举个简单的例子,我们设计购物商城之类的网站的时候一般商品都会有一级分类二级分类甚至三级分类或者再细分,如果按照传统思维我们可能会为每个级别的类别设置一张分类表然后再用外键去关联,虽然这样保证了没有冗余,但是我们完全没有必要设置这么多表,更何况商品类可以是无限细分的,我们不能因此而创建无数张表,最最重要的是这样多表连接查询时候会造成效率低下的问题,不利于性能的提升。

这个时候我们如何只设置一张类别表而且保证没有冗余呢?接下来揭开无限极分类表设计的面纱。


How?

至少包含三个字段,自身id,自身名,父级id.

先创建一张简单的表

CREATE TABLE tdb_goods_types(

type_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,

type_name VARCHAR(20) NOT NULL,

parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0

插入数据示例:

MySQL无限极分类表设计与查询讲解

如何高效查询

秘密武器:做自身连接起别名,然后利用左右连接来查询

自身连接为何物?同一个数据表对自身进行连接。注意一定要起别名!!

1.左连接–以右表为子表

SELECT s.type_id,s.type_name,p.type_name 
FROM tdb_goods_types AS s LEFT JOIN tdb_goods_types AS p 
ON s.parent_id=p.type_id;

这样我们便高效的查到了任一子类id及其关联的父类id.

MySQL无限极分类表设计与查询讲解

2.右连接–以右表为父表

SELECT p.type_id,p.type_name,s.type_name 
FROM tdb_goods_types AS p LEFT JOIN tdb_goods_type AS s
ON s.parent_id=p.type_id;

这样我们可以高效查到父类下所有的子类名称。

MySQL无限极分类表设计与查询讲解