为了账号安全,请及时绑定邮箱和手机立即绑定

关于无限级分类数据库表结构设计问题,遍历某分类下所有产品 效率

关于无限级分类数据库表结构设计问题,遍历某分类下所有产品 效率

森林海 2018-12-06 19:20:22
 关于无限级分类数据库表结构设计问题,遍历某分类下所有产品 效率 数据库表结构是这样的: [Category] 类别表 Id(int) 类别IdParentId(int) 父类IdName(nvarchar(50)) 类别名称 [Product] 产品表 Id(int) 产品名称Name(nvarchar(50)) 产品名称CategoryId(int) 类别Id(对应 [Category].Id)Info(ntext) 介绍信息……     [Category] 类别表数据Id   ParentId     Name 1   0         服装2   1         男装3   2         衬衫4   2         长裤5   2         短裤6   2         T恤7   2         外套8   2         卫衣9   2         西装10   4          休闲裤11   4          西裤12   4          牛仔裤13   4          运动裤       [Product] 产品表数据 不再一一举例Id   Name   CategoryId   Info1 23……   这样设计的结构,存在很严重的效率问题,假设我想找出某分类(假设为男装)下所有的产品,就需要用递归算法,找出(男装)下的所有子分类,然后对 产品表进行 条件 in 查询,得到产品列表   找出所有男装产品 首先写程序,递归出 男装分类下的子类列表(2,3,4,5,6,7,8,9,10,11,12,13) 然后用 sql 查询出来 select * from [Product] where CategoryId in(2,3,4,5,6,7,8,9,10,11,12,13) 这样做实在是太糟糕了   那么该怎么设计呢?
查看完整描述

3 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

嗯。。。补充楼上--!

 

Id   ParentId     Name  Path

1   0         服装   ,1,
2   1         男装   ,1,2,
3   2         衬衫   ,1,2,3,
4   2         长裤   ,1,2,4,
5   2         短裤   ,1,2,5,

.....

select * from [Product]  p where p.CategoryId in(select Id from [Category] c where c.path like  (select path from  [Category]  where Id=2) + '%' )

查看完整回答
反对 回复 2019-01-07
?
喵喔喔

TA贡献1735条经验 获得超5个赞

可以设计一个类别路径,这样找路径的时候就不用做递归了,不过如果一个子类别有多个父类别就可能不太好弄了

查看完整回答
反对 回复 2019-01-07
?
茅侃侃

TA贡献1842条经验 获得超21个赞

@foxidea: 

In 可以改成Join 你可以把两个查询改称一个

查看完整回答
反对 回复 2019-01-07
  • 3 回答
  • 0 关注
  • 502 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信