2

私の用語がやや不足しているため、私の質問のタイトルは間違いなく不自由ですが、以下で私が意味することを説明します.

次のような MySQL テーブルがあります。

categories:

category_id | parent_id

     0            0
     1            0
     2            1
     3            1
     4            3

今、私がやりたいのは、次のようなカテゴリ構造を出力することです:

category structure:

0
1 -> 2
     3 -> 4

カテゴリ構造を表示できるようにする必要があることに加えて、カテゴリが選択されている場合は、そのカテゴリとサブカテゴリのすべての記事を検索したいと考えています (記事は、各記事がそれを好むparent_category_id を持つ別のテーブルになります)それが入っているカテゴリ)。

これを行うことを考えることができる唯一の方法は次のとおりです。

  1. 表示されているカテゴリの ID と等しい parent_id を持つすべてのカテゴリを取得します
  2. すべての結果をループして、手順 1 を繰り返します。
  3. すべての結果がチェックされるまでそれを続けてください

これを行うより良い方法はありますか?

4

1 に答える 1

1

効率的な方法でそれを行う1つの方法は、ネストされたセットを使用することです。少し注意が必要で、更新が少し複雑です。

それはそのように機能します:

すべてのノードには2つのIDと1つのレベルがあります。すべての子ノードIDは、ノードIDの間にあります。例:

category_id | parent_id | low_id |  high_id 
 0            0          1          2
 1            0          3          10
 2            1          4          5
 3            1          6          9
 4            3          7          8

これで、「カテゴリ1のすべての子ノードを教えてください」と言うことができます。

select *
from categories
where low_id between 3 /* (low_id node1) */ and 10 /* (high_id node 1) */

ただし、ノードを挿入する必要がある場合は、他のノードを正しい位置に移動するためのアルゴリズムが必要です。また、ノードのレベルを保存することもできます。そのため、id / parent_idの関係を探す必要はなく、low_idで並べ替えて、レベルをインジケーターとして使用するだけで済みます。

プログラミング言語としてphpを使用する場合、ネストされたセットを処理するdoctrine2プラグインがあります。

編集:これは開始するのに良いポイントだと思います:http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

于 2012-09-25T18:46:04.330 に答える