我有一个数据库表,其格式如下
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。
答案 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的答案可能对所有实际都很好目的...
答案 2 :(得分:0)
有一种替代cyberkiwi所说的:查询整个表格和内存中的树木构建。命令式语言非常适合这种情况,而SQL则不适用。性能会好得多(因为SQL不仅要扫描一次,而且要扫描每个级别)。