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親カテゴリがメインカテゴリである必要があることを指定する節があります。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フィールドが期待どおりに機能するように、このクエリを変更するにはどうすればよいですか?

ここを参照してください:ツリー トラバーサル アルゴリズムに基づいて、この結果セットからツリー ビューを生成する方法は?

4

1 に答える 1

0

実際には、この数を探していると言いますが、主な親の子であるノードのみを探しています。それが本当に必要な場合、クエリはそれを修正するよりも間違っています-「p」と呼んで「親」テーブルであると思われるテーブルは、実際には「祖先」テーブルです-同様に「c」は子ではありませんが、 「子孫」。mainツリー内のすべてのノードのフラグ付きの祖先を数えることになります。

于 2010-12-06T20:10:47.593 に答える