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メモリ空間の詳細な説明

推薦する

MySQL の sql_mode モード例の詳細な説明

この記事では、MySQL の sql_mode モードについて例を挙げて説明します。ご参考までに、詳...

Mysql テーブルコメントフィールド取得操作

余計なことは言わないで、コードだけ見てみましょう〜 -- テーブル内のフィールドコメントを表示および...

簡単な約束を段階的に実行する方法を教えます

目次ステップ1: フレームワークを構築するステップ2 構築されたPromiseフレームワークに入力す...

JDBC-idea で mysql をインポートして java jar パッケージに接続する (mac)

序文1. この記事ではMySQL 8.0バージョンを使用していますバージョン5.0と比較すると、パッ...

overflow:hidden の役割の詳細な説明 (オーバーフローの非表示、フロートのクリア、マージンの崩壊の解決)

1. オーバーフロー:非表示 オーバーフロー非表示要素に overflow:hidden が設定さ...

JS で async と await を使用する方法

目次1. 非同期2. 待つ: 3. 包括的なアプリケーション1. 非同期async 、非同期コードが...

MySQL 5.7.18 リリース インストール ガイド (bin ファイル バージョンを含む)

インストール プロセスは、コンパイル手順を除いて、基本的にソース バージョンと同じです。この記事では...

Linux lessコマンド例の詳細な説明

ファイル名が少ないファイルを表示ファイル名を少なく | grep -n コンテンツを検索内容に応じて...

XHTML チュートリアル: Transitional と Strict の違い

実際、XHTML 1.0 は、Transitional DOCTYPE と Strict DOCTY...

MySQL 数千万のビッグデータに対するSQLクエリ最適化の知識ポイントのまとめ

1. クエリを最適化するには、テーブル全体のスキャンを避けてください。まず、where と orde...

MySQL FAQ シリーズ: ibdata1 ファイルのサイズが突然増加しないようにする方法

0. はじめにibdata1 ファイルとは何ですか? ibdata1 は、innodb システム テ...

CSS が複数のクラスに一致する方法のサンプルコード

CSSは複数のクラスにマッチする次の HTML タグ li、クラスはオープン スタイルです。私の要件...

Linux のハードリンクとソフトリンクの原理と使用法の分析

Linux システムには、ファイル共有を解決するために使用できるリンク ファイルと呼ばれる種類のファ...

Angular のパフォーマンス最適化: サードパーティ コンポーネントと遅延読み込みテクノロジー

目次概要環境の準備プロジェクトのパフォーマンスに影響を与える要因遅延読み込みとは何ですか?プロジェク...

MySQL シリーズ II マルチインスタンス構成

チュートリアルシリーズMySQL シリーズ: MySQL リレーショナル データベースの基本概念My...