0

私は 2 か月の半分以上の間、これを理解しようとしてきましたが、解決策が見つかりませんでした。再帰関数を使用してタイプ テーブルのデータを構築するための情報はたくさんありますが、実際のデータ テーブルにはありません。間違った用語を使用している可能性があります。これはメニューを構築するためではなく、動的フォームをセクションに構築するためのものです。

親列を削除すると、機能するようになりますが、追加のレベルが必要です。

これらはテストテーブルです

types
=====
id  name        parent
1   module1     0
2   module2     0
3   component1  1
4   component2  1
5   component3  2
6   component4  2

items
=====
id  name        type_id
1   item1       3
2   item2       3
3   item3       4
4   item4       4
5   item5       5
6   item6       5
7   item7       6
8   item8       6

私が達成しようとしている結果

desired output
==============

module1
    component1
        item1
        item2
    component2
        item3
        item4
module2
    component3
        item5
        item6
    component4
        item7
        item8

この種の問題に対する解決策はありますか?表の変更、リンク、または例? ありがとう。

4

2 に答える 2

1

次のクエリは機能しませんか、それとも私はあなたの質問を誤解していますか?

SELECT
    t2.`name` AS 'module',t1.`name` AS 'component',i.`name` AS 'item'
FROM (SELECT * FROM `types` WHERE `parent`>0)  t1
INNER JOIN `types` t2 ON t1.`parent`=t2.`id`
LEFT OUTER JOIN  `items` i ON i.`type_id`=t1.`id`

編集:デフォルトでIDが0より大きいために変更WHERE `parent`!=0されました(通常、明示的に設定されていない限り、負の整数は無効なIDです)。WHERE `parent`>0

于 2012-11-08T17:51:38.327 に答える
1

ネストされたセット モデルを使用して、階層を表すことができます。そうすれば、再帰呼び出しをなくすことができます。

他にできることは、推移閉包を使用して「子である」関係を処理するために処理する追加のテーブルを作成することです。つまり、ノード間のすべての is-a-descendant-of関係が得られます。

于 2012-11-08T17:50:05.580 に答える