メニューノードのすべての子ノードを再帰的に検索する 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データベースインデックスの左端一致原則

目次1. 共同インデックスの説明2. ac はインデックスを使用できますか? 3. 考える4. 最左...

CSSの絶対と相対について

冒頭にこう書かれています:アブソリュートは言った。「親戚よ、私はあなたを私の人生で見たくない!」なぜ...

ブルートフォース攻撃を防ぐためのシェルスクリプト設定

シェルスクリプトはアクセス制御を設定し、複数回のログイン失敗後にIPをブロックしてSSHのブルートフ...

Nginx 逆生成 Mogilefs 分散ストレージ例の詳細な説明

1. 分散ストレージシステムの概要情報技術の継続的な発展により、利便性がもたらされる一方で、データ量...

JavaScript での HTML キャンバスとページ ストレージ テクノロジの使用に関する詳細な説明

目次1. JavaScriptはHTMLでキャンバスを使用する2. ページストレージ技術1. Jav...

MySQLのどのフィールドがインデックスに適しているかについての簡単な説明

目次1 データベース インデックスを作成するための一般的なルールは次のとおりです。 2. 数千万件の...

JDBC および MySQL 一時テーブルスペースの詳細な分析

背景一時テーブルスペースは、データベースのソート操作を管理し、一時テーブルや中間ソート結果などの一時...

MySQL PXC は IST 送信のみで新しいノードを構築します (推奨)

需要シナリオ: 既存の PXC 環境には大量のデータがあります。新しく購入したサーバーをこのクラスタ...

ローカルでビルドした Docker イメージを Dockerhub に公開する方法

今日は、ローカルの Docker プロジェクト イメージを dockerhub に公開する方法を紹介...

トップに戻るボタンを実装するJavaScript

この記事では、トップに戻るボタンを実装するためのJavaScriptの具体的なコードを参考までに紹介...

xshell を使用して VMware で Linux に接続する方法 (2 つの方法)

【序文】最近、ITOO の試験システムのストレステストを行いたいので、自分のコンピュータに Lin...

CSS ピックアップ矢印、カタログ、アイコン実装コード

1. CSS その他のアイコンアイコンを作成するには 3 つの方法があります。写真css (小さな矢...

Windows 10にWSL2 Ubuntu20.04をインストールしてdocker環境を構築する方法

WSLを有効にするシステムがWindows 10 2004以降であることを確認してください 「メニュ...

Vueプロジェクトでページジャンプを実装する方法

目次1. vue-cli デフォルト プロジェクトを作成する (babel のみを含む) 2. 作成...

ubuntu16.04でNFSサービスを構築する方法

NFS の紹介NFS (ネットワーク ファイル システム) は、FreeBSD でサポートされている...