Mysqlツリー再帰クエリの実装方法

Mysqlツリー再帰クエリの実装方法

序文

部門テーブルなどのデータベース内のツリー構造データの場合、部門のすべての従属部門または部門のすべての上位部門を知る必要がある場合があります。このとき、MySQLの再帰クエリを使用する必要があります。

現在、プロジェクトを Oracle から MySQL に移行しています。MySQL にはない Oracle 関数がいくつかあったため、関数をカスタマイズするか、変換のために関数を置き換える方法を見つける必要がありました。

Oracle 再帰クエリ

Oracleが再帰クエリを実装している場合は、start with ... connect byを使用できます。

再帰クエリによる接続の基本的な構文は次のとおりです。

テーブルから 1 を選択し、... で開始し、以前の ID = pId で接続します。

start with: どのノードがルートノードであるかを示します。1=1 と記述しても制限はありません。ID 123 のノードをルートノードとして使用するには、start with id =123 と記述します。

connect by: connect by は必須です。start with は場合によっては省略できます。または、制限なく 1=1 で始まります。

Prior: prior キーワードは等号の前または後に置くことができ、意味が異なります。たとえば、prior id = pid は、pid がこのレコードのルート ノードであることを意味します。

詳細については、私が以前に書いた Oracle ブログを参照してください: https://www.jb51.net/article/156306.htm

Oracle 実装

<select id="listUnitInfo" resultType="com.admin.system.unit.model.UnitModel" databaseId="oracle">
 異なるu.unit_codeを選択し、
 u.ユニット名、
 u.ユニット_tel、
 u.para_unit_code
 lzcity_approve_unit_info から u
 1から始める = 1
 <if test="unitCode != null かつ unitCode !=''">
 u.unit_code = #{unitCode} です
 </if>
 <if test="unitName!=null かつ unitName!=''">
 u.unit_name は '%'|| #{unitName} ||'%' のようになります
 </if>
 事前の u.unit_code = u.para_unit_code で接続する
 および u.unit_code <>u.para_unit_code
 </選択>

MySQL 再帰クエリ

以下では主にMySQLの実装を紹介します。MySQLは同様の機能を提供していないため、カスタム関数を通じてのみ実装できます。インターネット上にはそのような資料がたくさんありますが、どれがオリジナルなのかわかりません。このブログはよく書かれています、https://www.jb51.net/database/201209/152513.html。以下では、著者が提供した方法を使用して、独自の実装も行います。共有してくれた著者に感謝します。

ここでは、著者が提供したカスタム関数と、Find_in_set関数find_in_set(u.unit_code,getunitChildList(#{unitCode}))使用します。ここで、getunitChildListはカスタム関数です。

<select id="listUnitInfo" resultType="com.admin.system.unit.model.UnitModel" databaseId="mysql">
 異なるu.unit_codeを選択し、
  u.ユニット名、
  u.ユニット_tel、
  u.para_unit_code
  t_unit_info から u
  <どこ>
  <if test="unitCode != null かつ unitCode !=''">
  そして find_in_set(u.unit_code,getunitChildList(#{unitCode}))
  </if>
  <if test="unitName!=null かつ unitName!=''">
  そして u.unit_name は concat('%', #{unitName} ,'%') のように記述します。
  </if>
  </どこ>
 </選択>

getUnitChildList カスタム関数

区切り文字 $$

`gd_base`$$ を使用します

存在する場合は関数を削除します `getUnitChildList`$$

CREATE DEFINER=`root`@`%` FUNCTION `getUnitChildList`(rootId INT) RETURNS VARCHAR(1000) CHARSET utf8
始める
 sChildList VARCHAR(1000) を宣言します。
 sChildTemp VARCHAR(1000) を宣言します。
 SET sChildTemp = CAST(rootId AS CHAR);
 sChildTempがNULLでない場合に実行
 sChildListがNULLでない場合
  SET sChildList = CONCAT(sChildList,',',sChildTemp);
 それ以外
 sChildList を CONCAT(sChildTemp) に設定します。
 終了の場合;
 LZCITY_APPROVE_UNIT_INFO から GROUP_CONCAT(unit_code) INTO sChildTemp を選択し、FIND_IN_SET(para_unit_code,sChildTemp)>0 を指定します。
 終了しながら;
 sChildList を返します。
終わり$$

区切り文字 ;

要約する

上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。

以下もご興味があるかもしれません:
  • MySQL ですべての子ノードのツリーのようなクエリを実装する方法
  • MySQL マルチレベル構造ツリー検索の紹介
  • MySQL 再帰クエリ ツリー テーブル子ノード、親ノードの特定の実装
  • MySQLクエリツリー構造方式

<<:  CentOS 8 インストール図 (超詳細なチュートリアル)

>>:  JSメモリ空間の詳細な説明

推薦する

新しい Linux ファイル権限設定における umask の詳細な理解

序文起源は質問 1 です: umask が 022 に設定されている場合、作成するファイルのデフォル...

Nginx のアンチホットリンクを設定する方法

実験環境• 最小限のインストール済みの CentOS 7.3 仮想マシン• 構成: 1 コア/512...

TypeScript をインストール、使用、自動コンパイルする方法に関するチュートリアル

1. TypeScriptの紹介前回の記事ではTypeScriptのインストール、使い方、自動コンパ...

innodb_autoinc_lock_mode の表現と値の選択方法についての簡単な説明

前提条件: Percona 5.6 バージョン、トランザクション分離レベルは RR mysql>...

MySQL の高度な機能 - データ テーブル パーティショニングの概念とメカニズムの詳細な説明

目次パーティション分割メカニズムSELECTクエリINSERT操作DELETE操作更新操作パーティシ...

VSCode 構成 Git メソッドの手順

Git は vscode に統合されており、git コマンドをいくつか記述しなくても、クリックするだ...

favico.ico---ウェブサイトicoアイコン設定手順

1. 正常に生成されたアイコン ファイルをダウンロードし、名前を favico.ico に変更して、...

ウェブページでグレーまたはブラックモードを実現するための CSS3 フィルターコード

フロントエンドcss3 フィルターは、Web ページのグレー効果を実現できるだけでなく、ナイト モー...

MySQL でテーブル メタデータ ロックを待機する理由と方法

MySQL が alter table などの DDL 操作を実行すると、テーブル メタデータ ロッ...

Tomcatアーキテクチャの原則をアーキテクチャ設計に分析する

目次1. 学習目標1.1. Tomcatアーキテクチャの設計と原則をマスターして社内スキルを向上させ...

ARMアーキテクチャにおける関数呼び出しプロセスの簡単な分析

目次1. 背景知識1. ARM64レジスタの紹介2. STP命令の詳しい説明(ARMV8マニュアル)...

Javascript のスコープとクロージャの詳細

目次1. 範囲2. スコープチェーン3. 語彙の範囲5. 閉鎖の適用6. クロージャの欠陥7. 閉会...

Win10 での MySQL 8.0.15 のインストールと設定のグラフィック チュートリアル

この記事ではMySQL 8.0.15のインストールと設定方法を参考までに記録します。具体的な内容は以...

CSS ワールド - コード実践: 画像の Alt 情報の表示

ただし、デフォルトの src を持つ <img> 要素を使用してスクロール読み込み効果を...