使用mysql查询找到所有嵌套子类别的最小密集方式

时间:2010-05-27 23:12:56

标签: php mysql categories

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

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

我希望能够从起点说起动物并列出所有子类别,因此对于动物我们会列出鸟类,哺乳动物,爬行动物,鹦鹉,企鹅,猫,DOgs ,蛇

单个查询是否可以实现?如果没有,我需要做什么

TIA

4 个答案:

答案 0 :(得分:2)

通过遵循下面的“修改过的预订树遍历”一文,您可以放弃递归并使用单个查询来查找使用单个SQL查询的子计数,直接类别和子类别:

  1. Managing Hierarchical Data in MySQL
  2. 在google.com上搜索关键字“Modified Tree Traversal + Sitepoint”,阅读sitepoint.com上解释相同模式的文章。

答案 1 :(得分:1)

如果向架构中添加一些层次结构元数据,则可以通过单个查询执行此操作。

将两个整数列(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)

现在选择获取动物和它的孩子,你可以运行像这样的查询:

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

当层次结构更改与读取查询的效率相比时,您显然已经权衡了重建元数据的成本。对于相对静态的层次结构,这种技术运作得相当好。

答案 2 :(得分:0)

SQL在遍历分层数据方面非常糟糕。

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

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

  • 将动物的孩子添加到阵列A
  • index = 0
  • 而索引&lt;长度(A)
    • 将儿童(A [i])追加到数组
    • index = index + 1

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

答案 3 :(得分:0)

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

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