メニューノードのすべての子ノードを再帰的に検索する MySQL メソッド

メニューノードのすべての子ノードを再帰的に検索する MySQL メソッド

背景

プロジェクトにはメニューノードのすべてのノードをチェックする要件があります。オンラインでチェックした後、ほとんどの方法はストアドプロシージャを使用します。オンライン環境ではストアドプロシージャを気軽に追加できないため、

したがって、ここでは同様の再帰メソッドを使用して、メニューのすべての子ノードを照会します。

準備する

メニュー テーブルを作成します。

テーブル `menu` を作成 (
 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'メニューID',
 `parent_id` int(11) デフォルト NULL コメント '親ノードID',
 `menu_name` varchar(128) デフォルト NULL コメント 'メニュー名',
 `menu_url` varchar(128) DEFAULT '' COMMENT 'メニューパス',
 `status` tinyint(3) デフォルト '1' コメント 'メニューステータス 1-有効; 0-無効',
 主キー (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12212 デフォルト CHARSET=utf8;

データを挿入:

`menu` に値 ('0'、null、'Menu0'、' '、'1') を挿入します。
`menu` に VALUES ('1', '0', 'メニュー 1', '', '1') を挿入します。
`menu` に VALUES ('11', '1', 'メニュー 11', '', '1') を挿入します。
`menu` に VALUES ('12', '1', 'メニュー 12', '', '1') を挿入します。
`menu` に VALUES ('13', '1', 'メニュー 13', '', '1') を挿入します。
`menu` に VALUES ('111', '11', 'Menu 111', '', '1') を挿入します。
`menu` に VALUES ('121', '12', 'Menu 121', '', '1') を挿入します。
`menu` に VALUES ('122', '12', 'Menu 122', '', '1') を挿入します。
`menu` に VALUES ('1221', '122', 'Menu 1221', '', '1') を挿入します。
`menu` に VALUES ('1222', '122', 'Menu 1222', '', '1') を挿入します。
`menu` に VALUES ('12211', '1222', 'Menu 12211', '', '1') を挿入します。

結果のディレクトリ構造は以下のようになります。

クエリ

まずSQL文を投稿します:

たとえば、メニュー ノード 12 のすべての子ノードをクエリする場合、クエリ結果は次のようになります。

分析する

まず、fromの後のステートメントを分析し、parent_idとidでソートし、クエリするメニューノードを変数として使用します。fromの後の結果は

次に、if (express1, express2, express3) 条件文を見てみましょう。if 文は三項演算子に似ています。exprss1 が true の場合は express2 が実行され、そうでない場合は express3 が実行されます。

FIND_IN_SET(str,strlist)、strは照会する文字列、strlistフィールド名パラメータは(1,2,6,8)のように「,」で区切られ、フィールド(strlist)に(str)を含む結果を照会し、結果をnullまたはレコードとして返します。

parent_id が @pid にある場合は、parent_id を @pid に追加し、行ごとに実行します。実行プロセスを次の表に示します。

このとき表示されるIDはメニューID12の子ノードIDすべてである。

これで、メニュー ノードのすべての子ノードに対する mysql 再帰検索に関するこの記事は終了です。メニュー ノードに対する mysql 再帰検索に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後も 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MySQL ダーティ ページ フラッシュとテーブル スペースの縮小の原理の分析
  • MySQL関連のツールをいくつかお勧めします
  • MySQL の lru リンク リストの簡単な分析
  • MySQL クエリ キャッシュとバッファ プール
  • MySQL カーディナリティ統計の簡単な分析
  • MySQL テーブルスペースとは何ですか?
  • MySQL の遅いクエリを見つける方法
  • MySQL フラッシュリストとダーティページフラッシュメカニズム

<<:  HTML で Web ページに動的な時計を書く

>>:  LinuxにNginxをインストールする詳細な手順

推薦する

MySQL Index Pushdown (ICP) とは何かを理解するための記事

目次1. はじめに2. 原則III. 実践3.1 インデックスプッシュダウンを使用しない3.2 イン...

Vue の基本 MVVM、テンプレート構文、データバインディング

目次1. Vueの概要Vue公式サイトMVVM アーキテクチャ パターンVue の紹介2. Vueを...

JavaScript 配列の include と Reduce の基本的な使用法

目次序文配列.プロトタイプ.includes文法パラメータ戻り値例配列プロトタイプの削減文法パラメー...

Docker のインストールと構成イメージの高速化の実装

目次DockerバージョンCentOS に Docker エンジンをインストールするシステム要件古い...

Linux 環境の Apache で https サービスを有効にする方法の詳細な説明

この記事では、Linux 環境の Apache で https サービスを有効にする方法について説明...

MySql の集計関数に条件式を追加する方法

MySQL のフィルタリングのタイミングは、集計関数で使用される where 条件と having ...

Ubuntu 18.04の下のディレクトリにディスクをマウントします

導入この記事では、Ubuntu 18.04 デスクトップ システムでディスクを目的のディレクトリにマ...

PID を作成できないために MySQL が起動できない問題を解決する方法

問題の説明MySQL 起動エラー メッセージは次のとおりです。 mysqld を起動します (sys...

Docker デプロイメント Springboot プロジェクト例の分析

この記事は主に、docker デプロイメント springboot プロジェクトのサンプル分析を紹介...

Reactエラー境界コンポーネント処理

React 16の内容です。最新技術ではありませんが、ドキュメントで調べるまであまり話題に上がらなか...

CSS でのシングル div 描画テクニックの実装

純粋な HTML + CSS を使ってドラえもんの絵を描くなど、CSS 描画に関する記事をよく見かけ...

MySQLユーザー削除バグを解決する

著者が MySQL を使用してユーザーを追加していたところ、ユーザー名が間違って記述されていることに...

Dockerの国内イメージソースを変更する方法

Dockerデーモンのアクセラレータを構成する設定ファイルから Docker を起動し、/etc/d...

Easyswoole ワンクリック インストール スクリプトとパゴダ インストール エラー

よくある質問easyswoole を初めて使用する場合は、次のような問題に遭遇することがよくあります...

Nginx の break と last の違いの詳細な分析

まずは違いについて話しましょう最後に、書き換えられたルールは、次の場所と一致させるために書き換えられ...