MySQLはカスタム関数を使用して親IDまたは子IDを再帰的に照会します

MySQLはカスタム関数を使用して親IDまたは子IDを再帰的に照会します

背景:

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 ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。
この記事が役に立ったと思われた方は、ぜひ転載していただき、出典を明記してください。ありがとうございます!

以下もご興味があるかもしれません:
  • MySQL 再帰クエリ ツリー テーブル子ノード、親ノードの特定の実装
  • Mysqlツリー再帰クエリの実装方法
  • MYSQLで再帰クエリを実装する方法
  • MySql8 WITH RECURSIVE 再帰クエリ親子コレクションメソッド
  • MySQL 8.0 再帰クエリの簡単な使用例

<<:  Dockerコンテナでyumを呼び出すときのエラーの解決方法

>>:  jQueryは動的タグイベントを実装します

推薦する

Ubuntu 向け VMware Tools のインストールと構成のチュートリアル

以前、ブロガーは VMware 仮想マシンに Ubuntu システムをインストールしました。まだイン...

NginxにおけるRewriteのリダイレクト設定と実践の詳しい解説

1: アドレス書き換えとア​​ドレス転送の意味を理解する。アドレス書き換えとア​​ドレス転送は異なる...

Docker は 2003 年の問題を解決するために MySQL リモート接続を導入しました

MySQLへの接続ここでは、リモート接続に navicat を使用します。MySQL に接続する前に...

MySQL 8.0.22.0 のダウンロード、インストール、設定方法のグラフィックチュートリアル

MySQL 8.0.22のダウンロード、インストール、設定方法、参考までに具体的な内容は次のとおりで...

nginx で gzip 圧縮を実装してウェブサイトの速度を向上させる方法

目次gzip 圧縮を使用する理由は何ですか? nginxはgzipを実装するgzip処理nginx ...

画面なしで無線ネットワークに接続しているときに Raspberry Pi の IP アドレスを見つける方法

あなたがlinuxerだと仮定すると、 windowserだとは想定しません。Windows ユーザ...

ネイティブJSで実装されたギャラリー機能

目次最初2番目Native Js はギャラリー機能を実装します。画像をクリックすると、対応する拡大画...

JavaScript でウェブ プレーヤーを実装する

今日は、JavaScript を使用して Web ページ上にプレーヤーを作成する方法を紹介します。誰...

DockerのTLS(SSL)証明書の有効期限の問題を解決する

問題現象: [root@localhost ~]# docker イメージをプル xxx.com.c...

CSSはletter-spacingプロパティを通じて単語間の間隔を制御します。

letter-spacing プロパティ: 文字間のスペース (文字間隔) を増減します。このプロ...

Spring jdbc のデータベース操作オブジェクト モデルの詳細な例

Spring jdbc のデータベース操作オブジェクト モデルの詳細な例Spring Jdbc デー...

Baidu Maps を Web ページに埋め込み、Baidu Maps API を使用してマップをカスタマイズする詳細な手順

ウェブページにBaiduマップを挿入するBaidu Maps を自分の Web ページに追加したい場...

Unix/Linux システムにおける nobody ユーザーと nologin の詳細な紹介

Unix/Linux システムの nobody ユーザーとは何ですか? 1. Windows システ...

MySQLでカーソルを宣言する方法

MySQL でカーソルを宣言する方法: 1. 変数とカーソルを宣言する 結果をvarchar(300...

Vue プロジェクトを実行するときに `--fix` オプションで修正できる可能性のある警告のエラー問題を解決します。

問題: vue-cil3 は、`--fix` オプションで修正できる可能性のある警告とともに実行され...