【问题标题】:Sql Self join query? How to get categories sub categories?Sql 自连接查询?如何获取类别子类别?
【发布时间】:2011-02-14 18:16:38
【问题描述】:

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

猫ID |类别 |父母ID 1 |第一类 |无效的 2 |子类别1 | 1 3 |子类别2 | 1 4 |子子1 | 3

等等……

有多个级别的类别。用什么查询可以得到如下格式的记录:

猫ID |类别 1 |第一类 2 |第一个类别/子类别1 3 |第一类/子类2 4 | firstCategory/SubCategory2/subSub1

类别 id 将是最后一个类别的 id。如何编写查询以将类别连接到所有级别?不同类别的确切级别数不同?

我正在使用 mySQL。

【问题讨论】:

  • 你知道嵌套的最大深度吗?如果没有,这就变成了一个迭代函数,需要更复杂的代码。
  • 我是 MSSQL 用户,在这个数据库引擎中,我们有一个 XMLPath() 函数,它可以完全满足您的需求。也许高级 MySql 用户可以告诉您 MySQL 中是否存在类似的功能...

标签: sql mysql join


【解决方案1】:

对于最大深度为 6(包括根),你可以使用这个

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

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

【讨论】:

    【解决方案2】:

    Oracle 具有此功能,我工作的公司完全按照您的描述使用它。不过,查询有时会很繁重。在此链接中可以找到对函数(“start with”和“connect by”关键字)的良好描述,以及您可能会尝试绕开的伪代码......尽管cyberkiwi的答案可能对所有实用程序都很好目的...

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2012-02-20
        • 2011-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-19
        • 1970-01-01
        • 1970-01-01
        • 2023-03-17
        相关资源
        最近更新 更多