0

在下面的查询中,有一个名为main用于区分类别的字段。因此,有公共类别和主要类别,两者都可以在树上找到。该main字段只是一种类型,树结构没有任何内容,我的意思是,它就像一个状态字段。

  SELECT `c`.*, 
           (count(p.id)-1) AS `depth` 
      FROM `categories` AS `c` 
  CROSS JOIN `categories` AS `p` 
     WHERE (c.lft BETWEEN p.lft AND p.rht) 
       AND (c.root_id =p.root_id) 
       AND (p.main =1) 
  GROUP BY `c`.`id` 
  ORDER BY `c`.`root_id` ASC, `c`.`lft` ASC

有一个where子句指定父类别必须是主类别。另外,有时我需要做一个selectwhere parent category is a common category p.main =0

depth是元素在树中的位置。因此,如果一个类别是另一个类别的一级子级,则深度将为1,如果为两级,则深度为2

我的问题是,当我进行上面的选择时,如果在父亲是主要类别(选择p.main =1)的树上标记为公共类别的孩子,则公共类别depth总是0

换句话说,选择工作正常,如果我选择所有类别的顶部父标记为main,它将显示所有类别的树,包括标记为的子类别main=0。但在这种情况下,深度总是0

查看结果:

替代文字

该类别1423是子类别27并且不是主类别,但是27是,所以深度是0,但需要是1。该类别276是子64类别,两者都是主要类别,因此它具有正确的深度。

如何更改此查询以使该depth字段按预期工作?

参考这里:How to generate a tree view from this result set based on Tree Traversal Algorithm?

4

1 回答 1

0

你实际上说你正在寻找这个计数,但只针对节点,什么是主要父母的孩子。如果那是您真正想要的,那么您的查询比仅仅修复它更错误-您称为“p”并且似乎认为是“父”表实际上是“祖先”表的表-同样,“c”不是子表,而是'后裔'。您最终计算main了树中所有节点的标记祖先。

于 2010-12-06T20:10:47.593 回答