背景: MySQL では、レベルに制限がある場合、たとえば、ツリーの最大深度を事前に決定できる場合、ノードをルートとするすべてのツリーの深度がツリーの最大深度を超えないように、左結合を通じて直接実装できます。 しかし、多くの場合、私たちは木の深さを制御したり、知ったりすることができません。このとき、MySQL のストアド プロシージャ (関数) を使用するか、プログラム内で再帰を使用して実装する必要があります。この記事では、MySQL の関数を使用して次のことを実現する方法について説明します。 1. 環境整備 1. テーブルを作成する テーブル `table_name` を作成します ( `id` int(11) NOT NULL AUTO_INCREMENT, `status` int(255) NULL デフォルト NULL, `pid` int(11) NULL デフォルト NULL, BTREE を使用した主キー (`id`) ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; 2. データを挿入する `table_name` に値 (1, 12, 0) を挿入します。 `table_name` に値 (2, 4, 1) を挿入します。 `table_name` に値 (3, 8, 2) を挿入します。 `table_name` に値 (4, 16, 3) を挿入します。 `table_name` に値 (5, 32, 3) を挿入します。 `table_name` に値 (6, 64, 3) を挿入します。 `table_name` に値 (7, 128, 6) を挿入します。 `table_name` に値 (8, 256, 7) を挿入します。 `table_name` に値 (9, 512, 8) を挿入します。 `table_name` に値 (10, 1024, 9) を挿入します。 `table_name` に値 (11, 2048, 10) を挿入します。 2. MySQL関数の作成 1. 現在のノードのすべての親ノードを照会する 区切り文字 // 関数 `getParentList`(root_id BIGINT) を作成します。 VARCHAR(1000)を返します 始める k INT デフォルト 0 を宣言します。 fid INT DEFAULT 1 を宣言します。 str VARCHAR(1000) DEFAULT '$' を宣言します。 rootId > 0 の場合 SET fid=(SELECT pid FROM table_name WHERE root_id=id); fid > 0の場合 SET str = concat(str,',',fid); root_id = fid を設定します。 それ以外 root_id=fidを設定します。 終了の場合; 終了しながら; 文字列を返します。 終わり // 区切り文字 ; 2. 現在のノードのすべての子ノードを照会する 区切り文字 // 関数 `getChildList`(root_id BIGINT) を作成します。 VARCHAR(1000)を返します 始める str VARCHAR(1000)を宣言します。 cid VARCHAR(1000) を宣言します。 k INT デフォルト 0 を宣言します。 str = '$' を設定します。 SET cid = CAST(root_id AS CHAR);12 cidがNULLでない場合 k > 0の場合 SET str = CONCAT(str,',',cid); 終了の場合; SELECT GROUP_CONCAT(id) INTO cid FROM table_name WHERE FIND_IN_SET(pid,cid)>0; k = k + 1 に設定します。 終了しながら; 文字列を返します。 終わり // 区切り文字 ; 3. テスト 1. 現在のノードのすべての親を取得する getParentList(10)を選択します。 2. 現在のノードのすべてのバイトを取得する getChildList(3)を選択します。 要約する 上記は、MySQL のカスタム関数を使用して親 ID または子 ID を再帰的にクエリする方法について紹介したものです。お役に立てば幸いです。ご質問がある場合は、メッセージを残してください。すぐに返信いたします。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。 以下もご興味があるかもしれません:
|
<<: Dockerコンテナでyumを呼び出すときのエラーの解決方法
1. MySQL のインデックスの使用方法インデックスは、特定の列の値を持つ行をすばやく見つけるため...
成果を達成する実装コードhtml <div class="コンテナ">...
目次概要プロミスレースメソッド約束の再パッケージ化中止コントローラAxiosプラグインにはキャンセル...
1. mysqldump バックアップ方法では論理バックアップが使用されます。最大の欠点は、バック...
序文: Vueプロジェクトで透かし効果を使用するには、コンテナを指定できます効果画像: 1. コンテ...
mysql 1 つのテーブル列を別のテーブルにコピーする場合によっては、フィールドから別の新しいフィ...
無料のパブリック STUN サーバーSIP 端末がプライベート IP アドレスを使用する場合、スタン...
問題を見つけるコンテンツをリストで表示すると、リスト内のコンテンツの数は多いかもしれませんが、ユーザ...
目次1 マウントディレクトリとファイルを作成する2 Redisイメージを取得する3 コンテナを作成し...
目次序文1. Dockerをインストールする2. ElasticSearchをインストールする3. ...
キー修飾子キーボード イベントをリッスンする場合、詳細なキーを確認する必要があることがよくあります。...
私はApacheを使ったことがありません。仕事を始めてからはずっとnginxを使っていました(運用保...
この記事では、3階層ナビゲーションの表示と非表示を実現するためのVueの具体的なコードを例として紹介...
HTMLとは何ですか?簡単に言えば、HTML は Web ページを作成するために使用されます。とて...
Nginx 仮想ドメイン名設定を使用すると、ドメイン名を購入せずに特定のドメイン名を介してローカル ...