ホームページ > データベース > mysql チュートリアル > すべての子ノードのツリー状のクエリを実装する MySQL メソッド_MySQL

すべての子ノードのツリー状のクエリを実装する MySQL メソッド_MySQL

WBOY
リリース: 2016-07-06 13:32:51
オリジナル
1383 人が閲覧しました

この記事の例では、MySQL がツリー内のすべてのサブノードのクエリを実装する方法について説明します。参考のために皆さんと共有してください。詳細は次のとおりです:

Oracle では、階層クエリがあることがわかっています。CONNECT BY を使用すると、現在のノードの下にあるすべての子ノードを簡単にクエリできます。残念ながら、MySQL の現在のバージョンには対応する関数がありません。

MySQL の制限されたレベルであれば、たとえばツリーの最大の深さが 4 であることを事前に決定でき、すべてのノードをルートとしたツリーの深さが 4 を超えない場合は、直接実装できます。左結合を介してそれを実行します。

しかし、多くの場合、ツリーの深さを制御することはできません。現時点では、MySQL のストアド プロシージャを使用してこの再帰を実装するか、プログラムにこの再帰を実装する必要があります。この記事では、いくつかの実装方法について説明します。

サンプルデータ:

リーリー

樹形図は以下の通りです

リーリー

方法 1: 関数を使用して、すべての子ノード番号を取得します。

すべての子ノード番号から構成される文字列を取得する関数 getChildLst を作成します。

リーリー

この getChildlst で find_in_set 関数を直接使用して検索します

リーリー

利点: シンプル、便利、再帰呼び出しレベルの深さの制限なし (max_sp_recursion_ Depth、最大 255)。

欠点: RETURNS varchar(1000) は拡張できますが、長さには制限があります。

MySQL の現在のバージョン (5.1.33-community) は、関数の再帰呼び出しをサポートしていません。

方法 2: 一時テーブルと手続き型再帰を使用する

以下のようにストアドプロシージャを作成します。 createChildLst は再帰プロセスであり、showChildLst は一時テーブルを準備して初期化するための呼び出しエントリ プロセスです。

リーリー

呼び出し時にノードを渡します

リーリー

Depth は、プログラムが何らかの表示フォーマットを実行できるようにするための深さです。 Oracle のレベル疑似列に似ています。 sno はソート制御のみを目的としています。この方法では、一時テーブル tmpLst を介してデータベース内の他のテーブルとの結合クエリを実行することもできます。

MySQL では、システム パラメータ max_sp_recursion_ Depth を使用して、再帰呼び出しのレベル数の上限を制御できます。次の例では、12 に設定します。

リーリー

利点: より柔軟な処理とレイヤー表示。そして結果はツリートラバースの順序で取得できます。

欠点: 再帰には 255 の制限があります。

方法 3: 中間テーブルとプロシージャを使用する

(この方法はyongyupost2000から提供されたサンプルを基にしています)

次のようにストアド プロシージャを作成します。 MySQL では同じステートメント内で一時テーブルへの複数の参照が許可されていないため、これは通常のテーブル tmpLst を使用することによってのみ実現できます。もちろん、使用後にこのテーブルをクリアするのはプログラムの責任です。

リーリー

実行後、tmpLst テーブルが生成されます。nLevel はノードの深さ、sCort は並べ替えフィールドです。

使用方法

リーリー

利点: レイヤー番号の表示。そして結果はツリートラバースの順序で取得できます。再帰制限はありません。

短所: MySQL には一時テーブルに制限があり、通常のテーブルのみを使用でき、後でクリーンアップする必要があります。

上記は、MySQL のストアド プロシージャを使用した比較的単純な実装方法をいくつか示しています。

さらに MySQL 関連のコンテンツに興味のある読者は、このサイトの特別トピックをチェックしてください: 「完全な MySQL ログ操作スキル」、「MySQL トランザクション操作スキルの概要」、「完全な MySQL ストアド プロシージャ スキル」、「MySQL の概要」データベースロック関連スキル』と『MySQLでよく使う関数のまとめ』

この記事が皆さんの MySQL データベース計画に役立つことを願っています。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート