【问题标题】:Least intensive way to find all nested subcategories using mysql query使用 mysql 查询查找所有嵌套子类别的最低强度方法
【发布时间】:2016-02-13 19:27:02
【问题描述】:

我有一个数据库,其中项目被分类。其中一些类别是嵌套的,例如:

Animals > Birds > Parrots  
Animals >  Birds > Penguin 
Animals > Mammals > Cats  
Animals > Mammals > Dogs 
Animals > Reptiles > Snakes 
Plants > Trees 
Plants > Flowers

我把这些放在一个表格里

CATEGORY    PARENT
Animals     -
Birds       Animals
Penguin     Birds

我希望能够以动物为起点,并列出该类别下的所有子类别,因此对于动物,我们将列出鸟类、哺乳动物、爬行动物、鹦鹉、企鹅、猫、狗, 蛇

这可以通过单个查询来实现吗?如果没有,我需要做什么

TIA

【问题讨论】:

标签: php mysql categories


【解决方案1】:

按照下面的“修改的预序树遍历”文章,您可以摆脱递归并使用单个查询在单个 SQL 查询中查找子计数、直接类别和子类别:

  1. Managing Hierarchical Data in MySQL

在 google.com 中搜索关键字“Modified Tree Traversal + Sitepoint”以阅读 sitepoint.com 上解释相同模式的文章。

【讨论】:

  • 优秀的链接!感谢分享!
【解决方案2】:

如果您将一些层次结构元数据添加到您的架构中,那么使用单个查询来执行此操作是可能且有效的。

将两个整数列(startend)添加到您的类别表中。然后对你的树进行深度优先遍历,在每一步增加一个计数器,并在进入节点时将计数器值分配给start,在离开时将计数器值分配给end(即,当它的所有子节点都已被处理时)。

因此,对于您的示例,值显示为(start,end)

Animals (1,18)
   Birds (2,7)
      Parrots (3,6 )
      Penguin (4,5)
   Mammals (8,13)
      Cats (9,12)
      Dogs (10,11)
   Reptiles (14,17)
      Snakes (15,16)
Plants (19,24)
   Trees (20,23)
   Flowers (21,22)

现在选择 get Animals and it's children 你可以运行类似这样的查询:

SELECT * FROM Category where start >=1 and start < 18

您显然已经权衡了在层次结构发生变化时重建元数据的成本与读取查询的效率。对于相对静态的层次结构,这种技术效果很好。

【讨论】:

    【解决方案3】:

    众所周知,SQL 不擅长遍历分层数据。

    我会对此进行编程并递归或迭代地找到所有孩子。

    以下伪代码应该可以工作(如果数据中没有循环)

    • 将动物的孩子添加到数组 A
    • 索引 = 0
    • 当索引
    • 将子项(A[i]) 附加到数组
    • 索引 = 索引 + 1

    如果层次结构中有循环,您必须确保不要附加已经在数组中的子元素,否则循环将消耗所有内存并崩溃

    【讨论】:

      【解决方案4】:

      我不太了解获取数据的 mysql 程序,但我们可以在 PHP 的帮助下使用单个 mysql 查询来获取嵌套数据,您可以对任何语言使用相同的逻辑。

      http://www.maheshchari.com/php-nested-categories-with-single-mysql-query/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多