无限级分类表设计

mysql> 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
-> );
Query OK, 0 rows affected (0.16 sec)

mysql>
mysql> INSERT tdb_goods_types(type_name,parent_id) VALUES('家用电器',DEFAULT
Query OK, 1 row affected (0.04 sec)

mysql> INSERT tdb_goods_types(type_name,parent_id) VALUES('电脑、办公',DEF
);
Query OK, 1 row affected (0.04 sec)

mysql> INSERT tdb_goods_types(type_name,parent_id) VALUES('大家电',1);
Query OK, 1 row affected (0.04 sec)

mysql> INSERT tdb_goods_types(type_name,parent_id) VALUES('生活电器',1);
Query OK, 1 row affected (0.05 sec)

mysql> INSERT tdb_goods_types(type_name,parent_id) VALUES('平板电视',3);
Query OK, 1 row affected (0.04 sec)

mysql> INSERT tdb_goods_types(type_name,parent_id) VALUES('空调',3);
Query OK, 1 row affected (0.05 sec)

mysql> INSERT tdb_goods_types(type_name,parent_id) VALUES('电风扇',4);
Query OK, 1 row affected (0.05 sec)

mysql> INSERT tdb_goods_types(type_name,parent_id) VALUES('饮水机',4);
Query OK, 1 row affected (0.05 sec)

mysql> INSERT tdb_goods_types(type_name,parent_id) VALUES('电脑整机',2);
Query OK, 1 row affected (0.04 sec)

mysql> INSERT tdb_goods_types(type_name,parent_id) VALUES('电脑配件',2);
Query OK, 1 row affected (0.06 sec)

mysql> INSERT tdb_goods_types(type_name,parent_id) VALUES('笔记本',9);
Query OK, 1 row affected (0.04 sec)

mysql> INSERT tdb_goods_types(type_name,parent_id) VALUES('超级本',9);
Query OK, 1 row affected (0.04 sec)

mysql> INSERT tdb_goods_types(type_name,parent_id) VALUES('游戏本',9);
Query OK, 1 row affected (0.05 sec)

mysql> INSERT tdb_goods_types(type_name,parent_id) VALUES('CPU',10);
Query OK, 1 row affected (0.04 sec)

mysql> INSERT tdb_goods_types(type_name,parent_id) VALUES('主机',10);
Query OK, 1 row affected (0.06 sec)

mysql> SHOW COLUMNS FROM tdb_goods_types;  #查看数据表的结构
+-----------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+----------------------+------+-----+---------+----------------+
| type_id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| type_name | varchar(20) | NO | | NULL | |
| parent_id | smallint(5) unsigned | NO | | 0 | |
+-----------+----------------------+------+-----+---------+----------------+

mysql> SELECT * FROM tdb_goods_types;  #查看插入的记录
+---------+-----------  -+- --- - -----+
| type_id | type_name | parent_id |
+---------+-----  -------+- ------ - --+
| 1         | 家用电器      | 0             |
| 2         | 电脑、办公   | 0             |
| 3         | 大家电         | 1             |
| 4         | 生活电器      | 1             |  
| 6         | 空调 | 3 |
| 7 | 电风扇 | 4 |
| 8 | 饮水机 | 4 |
| 9 | 电脑整机 | 2 |
| 10 | 电脑配件 | 2 |
| 11 | 笔记本 | 9 |
| 12 | 超级本 | 9 |
| 13 | 游戏本 | 9 |
| 14 | CPU | 10 |
| 15 | 主机 | 10 |
+---------+------------+-----------+
15 rows in set (0.03 sec

自身连接:同一个数据表对其自身进行连接(想象左边是父表,右边是子表,参照物为子类)

mysql> 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;
+---------+------------+------------+
| type_id | type_name | type_name |
+---------+------------+------------+
| 1 | 家用电器 | NULL |
| 2 | 电脑、办公 | NULL |
| 3 | 大家电 | 家用电器 |
| 4 | 生活电器 | 家用电器 |
| 5 | 平板电视 | 大家电 |
| 6 | 空调 | 大家电 |
| 7 | 电风扇 | 生活电器 |
| 8 | 饮水机 | 生活电器 |
| 9 | 电脑整机 | 电脑、办公 |
| 10 | 电脑配件 | 电脑、办公 |
| 11 | 笔记本 | 电脑整机 |
| 12 | 超级本 | 电脑整机 |
| 13 | 游戏本 | 电脑整机 |
| 14 | CPU | 电脑配件 |
| 15 | 主机 | 电脑配件 |
+---------+------------+------------+
15 rows in set (0.00 sec)

同一个数据表对其自身进行连接(想象左边是子表,右边是父表,参照物为父类)

mysql> SELECT p.type_id,p.type_name,s.type_name FROM tdb_goods_types AS P LEFT
JOIN tdb_goods_types AS s ON s.parent_id=p.type_id;
+---------+------------+-----------+
| type_id | type_name | type_name |
+---------+------------+-----------+
| 1 | 家用电器 | 大家电 |
| 1 | 家用电器 | 生活电器 |
| 2 | 电脑、办公 | 电脑整机 |
| 2 | 电脑、办公 | 电脑配件 |
| 3 | 大家电 | 平板电视 |
| 3 | 大家电 | 空调 |
| 4 | 生活电器 | 电风扇 |
| 4 | 生活电器 | 饮水机 |
| 5 | 平板电视 | NULL |
| 6 | 空调 | NULL |
| 7 | 电风扇 | NULL |
| 8 | 饮水机 | NULL |
| 9 | 电脑整机 | 笔记本 |
| 9 | 电脑整机 | 超级本 |
| 9 | 电脑整机 | 游戏本 |
| 10 | 电脑配件 | CPU |
| 10 | 电脑配件 | 主机 |
| 11 | 笔记本 | NULL |
| 12 | 超级本 | NULL |
| 13 | 游戏本 | NULL |
| 14 | CPU | NULL |
| 15 | 主机 | NULL |
+---------+------------+-----------+

mysql> SELECT p.type_id,p.type_name,s.type_name FROM tdb_goods_types AS P LEFT J
OIN tdb_goods_types AS s ON s.parent_id=p.type_id GROUP BY p.type_name;
+---------+------------+-----------+
| type_id | type_name | type_name |
+---------+------------+-----------+
| 14 | CPU | NULL |
| 15 | 主机 | NULL |
| 3 | 大家电 | 平板电视 |
| 1 | 家用电器 | 大家电 |
| 5 | 平板电视 | NULL |
| 13 | 游戏本 | NULL |
| 4 | 生活电器 | 电风扇 |
| 2 | 电脑、办公 | 电脑整机 |
| 9 | 电脑整机 | 笔记本 |
| 10 | 电脑配件 | CPU |
| 7 | 电风扇 | NULL |
| 6 | 空调 | NULL |
| 11 | 笔记本 | NULL |
| 12 | 超级本 | NULL |
| 8 | 饮水机 | NULL |
+---------+------------+-----------+

mysql> SELECT p.type_id,p.type_name,s.type_name FROM tdb_goods_types AS P LEF
OIN tdb_goods_types AS s ON s.parent_id=p.type_id GROUP BY p.type_name ORDER
p.type_id;
+---------+------------+-----------+
| type_id | type_name | type_name |
+---------+------------+-----------+
| 1 | 家用电器 | 大家电 |
| 2 | 电脑、办公 | 电脑整机 |
| 3 | 大家电 | 平板电视 |
| 4 | 生活电器 | 电风扇 |
| 5 | 平板电视 | NULL |
| 6 | 空调 | NULL |
| 7 | 电风扇 | NULL |
| 8 | 饮水机 | NULL |
| 9 | 电脑整机 | 笔记本 |
| 10 | 电脑配件 | CPU |
| 11 | 笔记本 | NULL |
| 12 | 超级本 | NULL |
| 13 | 游戏本 | NULL |
| 14 | CPU | NULL |
| 15 | 主机 | NULL |
+---------+------------+-----------+

mysql> SELECT p.type_id,p.type_name,count(s.type_name) AS child_count FROM tdb_g
oods_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;
+---------+------------+-------------+
| type_id | type_name | child_count |
+---------+------------+-------------+
| 1 | 家用电器 | 2 |
| 2 | 电脑、办公 | 2 |
| 3 | 大家电 | 2 |
| 4 | 生活电器 | 2 |
| 5 | 平板电视 | 0 |
| 6 | 空调 | 0 |
| 7 | 电风扇 | 0 |
| 8 | 饮水机 | 0 |
| 9 | 电脑整机 | 3 |
| 10 | 电脑配件 | 2 |
| 11 | 笔记本 | 0 |
| 12 | 超级本 | 0 |
| 13 | 游戏本 | 0 |
| 14 | CPU | 0 |
| 15 | 主机 | 0 |
+---------+------------+-------------+

原文地址:https://www.cnblogs.com/toudoubao/p/6628106.html