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

推薦する

Docker クロスホストネットワーク (オーバーレイ) の実装

1. Dockerのホスト間通信Docker クロスホスト ネットワーク ソリューションには以下が含...

Nginxの現在の制限設定の詳細な説明

この記事では、最も単純なものから最も複雑なものまで、Nginx の現在の制限構成を例を使って説明しま...

vue3 で vue-router を使用するための完全な手順

序文ルーティングの管理は、ほとんどのシングルページ アプリケーションにとって不可欠な機能です。 Vu...

Navicat が MySql サーバーにリモート接続できない問題の解決策

Navicat が MySql サーバーにリモート接続できない問題の解決策は、先頭に書かれています:...

Vueはプルダウンとスクロールでデータを読み込む例を実装しています

目次ステップ1: インストールステップ2: 引用ステップ3: 使用Webプロジェクトでは、データを読...

JavaScript で二分探索木を実装する

JavaScriptでの検索二分木実装は参考までに。具体的な内容は以下のとおりです。バイナリ検索木 ...

Echarts 基本入門: 棒グラフと折れ線グラフの一般的な構成

1eChartsの基本手順4つのステップ1 DOMコンテナを見つける2 初期化3 設定オプション4 ...

Linux SSHポートを転送する3つの方法

ssh は私が最も頻繁に使用する 2 つのコマンドライン ツールのうちの 1 つです (もう 1 つ...

Mysql の mysql.user ユーザー テーブルの詳細な説明

MySQL は、異なるユーザーに異なる権限を割り当てることができるマルチユーザー管理データベースであ...

Linux で最も頻繁に使用されるターミナル コマンドのトップ 10 のリストを取得します。

私が最も頻繁に使用するコマンドは次の通りです:選択肢CDギットls ssh須藤数週間前、私はこの R...

MySql テーブル、データベース、シャーディング、パーティショニングの知識ポイントの紹介

1. はじめにデータベース内のデータ量が一定レベルに達すると、システムパフォーマンスのボトルネックを...

データベース内のSQL整合性制約ステートメントの分析

整合性制約整合性制約はテーブル データの正確性を保つためのものです。データが正しくない場合は、そもそ...

動的な背景グラデーション効果を実現するCSS3

CSS3 を学ぶということは、新しい機能と基本的な理論に慣れることを意味します。この記事では、ケー...

MySQL で union all を使用してユニオンソートを取得する方法

プロジェクトでは、何らかの不可逆的な理由により、テーブルに保存されたデータがページの表示要件を満たす...

MySQL の削除に基づく構文エイリアスの問題

目次MySQL 削除構文エイリアスの問題mysql の delete ステートメントでエイリアスを使...