この記事の例では、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 データベース計画に役立つことを願っています。