在做数据库分类表的时候,通常会有这样的设计:一个字段是ID,另一个字段PID,PID指向自己的上级分类;
这样的设计带来的问题是:我要删除一个类,我希望它的子类全部一起删除;
在不知道分类有多少层级的时候,删除全部子类是非常麻烦的一件事情。
在设计表之初,只需要多一个辅助字段path,令path记住自己的id路径即可解决这个问题。
比如:电视的ID是1,它的PID是0(表示没有父类),海尔电视的ID是2,海尔电视的PID是1;
这时候电视的path就是"0,1",海尔电视的path就是"0,1,2"。
在查询的时候,使用MySQL自带的FIND_IN_SET()函数即可。
CREATE TABLE `cls` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`pid` int(10) unsigned DEFAULT NULL,
`path` varchar(10) DEFAULT NULL,
`level` int(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4; ##根据ID,查找此ID下的所有子类
SELECT * FROM `cls` AS T WHERE FIND_IN_SET('',T.path); ##可以试试下一句看看效果
SELECT FIND_IN_SET('b','a,b,c,d');