1

私はこのような構造を持っています:

  • A(ルート ノード) には 2 つの子B(左の子) とC(右の子) があります。
  • 同様に、(左の子) と(右の子)Bの 2 つのノードもあります。DE
  • 同様Cに2つのノードF(左の子)、G(右の子)も同様に1つ持っています。

私の質問は次のとおりです。

  • A(ルート ノード)を入力すると、 の下Aにあるすべての子ノードが表示され、出力は次のようになりますB, C, D, E, F,G
  • 同様に、入力すると、出力Bは次のようになりDますE

私の2番目のクエリは、入力Aすると、どちらが彼の左の子であるか、右の子であるかが表示されるということです。

私のテーブル構造はこのようなものです

id     c_n      p_n 

1       B        A

2       C        A

3       D        B

4       E        B

のように。

idここには、c_n、 の3 つのフィールドがありますp_n

どんな体でも私を助けることができますか?

4

2 に答える 2

0

現在のスキーマが与えられた場合、以下は、要求に従って、カンマ区切りの文字列で (条件付きで) 1 つまたは 2 つのレベルの階層から子ノードをプルします。

SELECT 
    CONCAT(
        GROUP_CONCAT(t1.c_n), 
        IF(COUNT(t2.c_n), ',', ''), 
        GROUP_CONCAT(t2.c_n)
    ) AS nodex
FROM table_name AS t1
LEFT JOIN table_name AS t2 ON t1.c_n = t2.p_n
WHERE t1.p_n = 'A'
GROUP BY t1.p_n

nested setただし、単純さと選択の速度のために、モデルへの切り替えを検討する必要があります。

于 2013-03-17T18:12:15.187 に答える
0

lftおよびの2 つの追加フィールドを導入rgtし、これら 2 つの列を使用するテーブルにネストされたツリー モデルを使用する必要があります。

このセットアップと使用法を説明するドキュメントの例は、こちらです。

これにより、これらの種類のクエリをより効率的に行うことができます。

たとえば、ツリー全体を取得するにはlft、ルートよりも大きいノードrgtと小さいノードをすべてクエリする必要があります。

于 2013-03-17T18:12:39.403 に答える