【问题标题】:Finding all non-empty categories in a tree在树中查找所有非空类别
【发布时间】:2011-04-06 10:54:10
【问题描述】:

我有一个这样设置的类别表 [id, name, parent_id] 和一个项目表 [id, name, category_id, visible]。我想要做的是创建一个查询,它将返回所有非空类别的所有 id,非空是它或它的一个孩子至少有一个属于它的项目。在 MySQL 中执行此操作的最佳方法是什么?

编辑

从项目中选择 DISTINCT category_id

这适用于包含项目的类别,但我还需要所有包含类别的项目的父类别。此查询将与其他一些过滤器一起用作子查询。

顶级类别

->二级分类

-->三级分类

--->第 1 项

--->第二条

【问题讨论】:

    标签: php mysql tree


    【解决方案1】:

    也许题外话,但我认为它仍然值得参考:Extensive Article on Managing Hierarchical Data in MySQL

    【讨论】:

      【解决方案2】:

      所有非空类别,只有那些,有category_id指向它们的项目,因此你可以从项目表中选择category_ids:

      SELECT DISTINCT category_id FROM Items
      

      据我所知,您无法在一个查询中选择这些类别的所有祖先,但是您可能希望使用另一种树模型。

      使用nested set model,您的查询可能如下所示:

      SELECT DISTINCT c.id FROM Categories c JOIN Items ON c.id = category_id JOIN Categories ancestors ON c.lft BETWEEN ancestors.lft AND ancestors.rgt
      

      我不确定它是否会起作用,但你可以试试。

      【讨论】:

      • 真正的问题是递归查询。您的答案不会返回其子类别有项目的类别。
      • 哦,你是对的。然而,虽然可以返回他们的父母,但通过一个查询返回所有祖先是不可行的。
      • 谢谢,我将研究其他项目的嵌套集。遗憾的是,我目前正在使用成熟的数据库和代码库。
      猜你喜欢
      • 2014-12-10
      • 2013-07-18
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多