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

推薦する

Hタグはウェブページ制作において適切に使用すべきである

HTML タグには、ページのタイトルを処理するための特別なタグがあります。これらは h1、h2、h3...

MySQL で指定エンコーディングを実装する際の落とし穴について

前面に書かれた環境: MySQL 5.7+、MySQL データベースの文字エンコードは utf8、テ...

MySQL インデックス データ構造の詳細な分析

目次概要インデックスデータ構造バイナリツリー赤黒木BツリーB+ツリーハッシュ索引InnoDB インデ...

VMware仮想マシンでのLinuxのコピー&ペーストの詳細な説明

1. VMware Workstation 上の Linux: 1. ソースの更新(オプション) v...

WeChatアプレットが弾丸画面を送信するビデオプレーヤーを実装

この記事では、WeChatアプレットでビデオプレーヤーの集中砲火を実装するための具体的なコードを参考...

Dockerコンテナの個別展開のためのLNMPの実装

1. 環境整備各コンテナの IP アドレス: nginx: 172.16.10.10マイSQL: 1...

Vue フィルターの使用とタイムスタンプ変換の問題

目次1. 概念をすぐに認識する: 2. ローカルフィルター: 3. グローバルフィルター: 4. 拡...

Elasticsearchツールcerebroのインストールと使用チュートリアル

Cerebro は、Elasticsearch バージョン 5.x より前の Elasticsear...

MySQLの半同期の詳細な説明

目次序文MySQL マスタースレーブレプリケーションMySQL でサポートされているレプリケーション...

Mysql general_log をクリーンアップする方法の概要

方法1: グローバル general_log を 'OFF' に設定します。 テーブ...

MySQLデータベースのタイムアウト設定を構成する方法の例

目次序文1. JDBCタイムアウト設定2. 接続プールのタイムアウト設定3. MyBatisクエリの...

Dockerの基本的なネットワーク構成の詳細な説明

外部アクセスポートをランダムにマップする -P フラグを使用すると、Docker は 49000 か...

航空機戦争ゲームを実装するためのJavaScript

この記事では、キャンバスとjsを使用して簡単な飛行機戦争を実装する方法を参考までに紹介します。具体的...

JSの矢印関数におけるこのポイントの詳細な説明

矢印関数は ES6 の新機能です。独自の this はありません。その this ポイントは外部のコ...

VueでEchartsチャートの幅と高さの適応を実現する実践

目次1. インストールとインポート2. 手ぶれ補正機能を定義する3. チャートコードを描くinit ...