Sql自联接查询?如何获得类别子类别?

时间:2011-02-14 18:16:39

标签: sql mysql join

我有一个数据库表,其格式如下

catID | category      | parentID
1     | firstCategory | null
2     | SubCategory1  | 1
3     | SubCategory2  | 1
4     | subSub1       | 3

依旧......

有多个级别的类别。可以使用什么查询以下列格式获取记录:

catID | category 
1     | firstCategory
2     | firstCategory/SubCategory1
3     | firstCategory/SubCategory2
4     | firstCategory/SubCategory2/subSub1

类别ID将是最后一个类别的ID。如何编写查询以将类别加入所有级别?不同类别的确切级别数是不同的?

我正在使用mySQL。

3 个答案:

答案 0 :(得分:2)

对于最大深度为6(包括root),您可以使用此

select l0.catID,
    concat(
      case when l5.catID is null then '' else concat(l5.category, '/') end
    , case when l4.catID is null then '' else concat(l4.category, '/') end
    , case when l3.catID is null then '' else concat(l3.category, '/') end
    , case when l2.catID is null then '' else concat(l2.category, '/') end
    , case when l1.catID is null then '' else concat(l1.category, '/') end
    , l0.category)
from catcat l0
left join catcat l1 on l0.parentID=l1.catID
left join catcat l2 on l1.parentID=l2.catID
left join catcat l3 on l2.parentID=l3.catID
left join catcat l4 on l3.parentID=l4.catID
left join catcat l5 on l4.parentID=l5.catID

根据需要扩展图案,以获得更长的最大深度。

答案 1 :(得分:0)

Oracle具有此功能,我所工作的公司将其用于您所描述的内容。但有时候查询会非常繁重。在这个链接中可以找到一个很好的函数写法(“以”开头“和”连接“关键字),以及你可能试图绕过的伪代码......虽然cyberkiwi的答案可能对所有实际都很好目的...

http://www.adp-gmbh.ch/ora/sql/connect_by.html

答案 2 :(得分:0)

有一种替代cyberkiwi所说的:查询整个表格和内存中的树木构建。命令式语言非常适合这种情况,而SQL则不适用。性能会好得多(因为SQL不仅要扫描一次,而且要扫描每个级别)。