最近在找一次sql查询的无限分类查询的设计,网上找了一下这个数据表的设计很有特色,
不用递归,依靠个简单SQL语句就能列出菜单,看看这个数据表怎么设计的,并对下面的数据表结构的查询进行分析.
数据库字段大概如下:
———————————————————————————–
id 编号
fid 父分类编号
name 分类名
path 分类路径,以 id 为节点,组成类似 ,1,2,3,4, 这样的字符串
———————————————————————————-
可以假设有如下的数据
id fid name path
—————————————————-
1 0 分类1 ,1,
2 0 分类2 ,2,
3 1 分类1-1 ,1,3,
4 1 分类1-2 ,1,4,
5 2 分类2-1 ,2,5,
6 4 分类1-2-1 ,1,4,6,
—————————————————-
查询分类2底下的所有分类
============================底下是测试数据=============================
--添加分类表 CREATE TABLE tab ( id INT, fid INT, name VARCHAR(100), path VARCHAR(100) ) GO INSERT INTO [tab]([id],[fid],[name],[path])VALUES(1,0,'分类1',',1,') INSERT INTO [tab]([id],[fid],[name],[path])VALUES(2,0,'分类2',',2,') INSERT INTO [tab]([id],[fid],[name],[path])VALUES(3,0,'分类3',',3,') INSERT INTO [tab]([id],[fid],[name],[path])VALUES(4,2,'分类4-2',',2,4,') INSERT INTO [tab]([id],[fid],[name],[path])VALUES(5,2,'分类5-2',',2,5,') INSERT INTO [tab]([id],[fid],[name],[path])VALUES(6,1,'分类1-1',',6,1,') INSERT INTO [tab]([id],[fid],[name],[path])VALUES(7,4,'分类7-4-2',',7,4,2,') INSERT INTO [tab]([id],[fid],[name],[path])VALUES(8,5,'分类8-5-2',',8,5,2,') INSERT INTO [tab]([id],[fid],[name],[path])VALUES(9,7,'分类9-7-4-2',',9,7,4,2,') GO SELECT * FROM tab WHERE charindex(',2,',path)>0 GO --添加文章表 CREATE TABLE article ( aid INT, id INT, aname VARCHAR(100), ) GO INSERT INTO [article]([aid],[id],[aname])VALUES(1,1,'1这是名称1111111111111111111') INSERT INTO [article]([aid],[id],[aname])VALUES(1,4,'4这是名称444444444444444444444444') INSERT INTO [article]([aid],[id],[aname])VALUES(1,7,'7这是名称777777777777777777777777') INSERT INTO [article]([aid],[id],[aname])VALUES(1,9,'9这是名称999999999999999999999999') INSERT INTO [article]([aid],[id],[aname])VALUES(1,4,'4这是名称44444444444444444444') INSERT INTO [article]([aid],[id],[aname])VALUES(1,9,'4这是名称999999999999999999999999') GO SELECT * FROM article INNER JOIN tab ON tab.id=article.id WHERE charindex(',2,',path)>0 GO DROP TABLE tab DROP TABLE article |