以下のクエリには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
また、親カテゴリが共通カテゴリである場所を実行する必要がある場合もありますp.main =0
。
はdepth
、ツリー内の要素の位置です。したがって、あるカテゴリが別のレベルの子である場合、深さは になり1
、2 つのレベルの場合、深さは になります2
。
私の問題は、上記の選択を行うときに、親がメイン カテゴリであるツリーに共通カテゴリとしてマークされた子がいる場合 ( を選択p.main =1
)、共通カテゴリdepth
は常に であるということ0
です。
つまり、選択は適切に機能します。最上位の親が としてマークされているすべてのカテゴリを選択するとmain
、 でマークされた子カテゴリを含むすべてのカテゴリを含むツリーが表示されmain=0
ます。しかし、この場合、深さは常に0
結果を見る:
カテゴリ1423
は の子で27
あり、メイン カテゴリではありませんが27
、深さは ですが0
、 である必要があります1
。カテゴリ276
は の子で64
あり、両方がメイン カテゴリであるため、適切な深さがあります。
depth
フィールドが期待どおりに機能するように、このクエリを変更するにはどうすればよいですか?
ここを参照してください:ツリー トラバーサル アルゴリズムに基づいて、この結果セットからツリー ビューを生成する方法は?