在下面的查询中,有一个名为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
子句指定父类别必须是主类别。另外,有时我需要做一个select
where 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?