MySQLの再帰問題

MySQLの再帰問題

MySQL自体は再帰構文をサポートしていませんが、自己接続を通じていくつかの単純な再帰を実現できます。

--再帰的方法: 一時テーブルと通常のテーブルに対する異なる方法 -- この質問では、再帰的な drop table if exists テストを使用して、一時テーブルを使用して親ノードを 2 回クエリします。
テーブルテストを作成(
id varchar(100)、
名前varchar(20),
親ID varchar(100)
);
挿入テスト選択
'13ed38f1-3c24-dd81-492f-673686dff0f3'、'大学教師'、'37e2ea0a-1c31-3412-455a-5e60b8395f7d' 結合すべて選択 
'1ce203ac-ee34-b902-6c10-c806f0f52876'、'小学校教師'、'37e2ea0a-1c31-3412-455a-5e60b8395f7d' 結合すべて選択 
'37e2ea0a-1c31-3412-455a-5e60b8395f7d'、'教師'、null ユニオンすべて選択 
'c877b7ea-4ed3-f472-9527-53e1618cb1dc'、'高等数学教師'、'13ed38f1-3c24-dd81-492f-673686dff0f3' 結合すべて選択 
'ce50a471-2955-00fa-2fb7-198f6b45b1bd'、'中学校教師'、'37e2ea0a-1c31-3412-455a-5e60b8395f7d';
 
区切り文字 $$
 
プロシージャ usp_ser(idd varchar(100) 内) を作成します。
始める
lev int を宣言します。
lev=1 を設定します。
tmp1 が存在する場合はテーブルを削除します。
tmp2 が存在する場合はテーブルを削除します。
一時テーブル tmp1(id varchar(100),name varchar(20),parentid varchar(100),levv int) を作成します。
一時テーブル tmp2(pid varchar(100)) を作成します。
tmp2 を挿入します。test から parentid を選択します (id=idd);
tmp1 を挿入し、t.* を選択し、lev を test t から結合し、tmp2 a を t.id=a.pid に結合します。
    存在する間(tmp2から1を選択)
する
tmp2を切り捨てます。
lev=lev+1 を設定します。
tmp2 を挿入し、test t から t.id を選択し、tmp1 a を t.id=a.parentid および a.levv=lev-1 に結合します。
tmp1 を挿入し、test t から t.*,lev を選択し、tmp2 a を t.id=a.pid に結合します。
終了しながら;
tmp1 から id、name、parentid を選択します。
終わり;
$$
 
区切り文字 ;
 
 usp_ser('c877b7ea-4ed3-f472-9527-53e1618cb1dc') を呼び出します。
+--------------------------------------+----------+--------------------------------------+
| ID | 名前 | 親 ID |
+--------------------------------------+----------+--------------------------------------+
| 13ed38f1-3c24-dd81-492f-673686dff0f3 | 大学教員 | 37e2ea0a-1c31-3412-455a-5e60b8395f7d |
| 37e2ea0a-1c31-3412-455a-5e60b8395f7d | 教師 | NULL |
+--------------------------------------+----------+--------------------------------------+
 
 usp_ser('13ed38f1-3c24-dd81-492f-673686dff0f3') を呼び出します。
+--------------------------------------+------+----------+
| ID | 名前 | 親 ID |
+--------------------------------------+------+----------+
| 37e2ea0a-1c31-3412-455a-5e60b8395f7d | 教師 | NULL |
+--------------------------------------+------+----------+
 
 usp_ser('37e2ea0a-1c31-3412-455a-5e60b8395f7d') を呼び出します。
 
空セット (0.02 秒)

上記の方法では、MySQL では同じステートメント内で一時テーブルへの複数の参照が許可されていないため、2 つの一時テーブルを使用します。以下は、通常のテーブルを使用して子ノードを 1 回クエリする再帰クエリです。

コアコード

存在する場合はテーブルを削除するテスト。
テーブルテストを作成(
id INT、
親ID INT
);
挿入テスト選択
1, 0 UNION ALL SELECT 
2, 1 UNION ALL SELECT 
3, 1 UNION ALL SELECT 
4, 0 UNION ALL SELECT 
5, 2 UNION ALL SELECT 
6, 5 ユニオン すべて選択 
7, 3 ;
行く
 
区切り文字 $$
 
プロシージャ usp_ser(idd varchar(100) 内) を作成します。
始める
lev int を宣言します。
lev=1 を設定します。
tmp1 が存在する場合はテーブルを削除します。
テーブル tmp1(id INT、parentid INT、levv INT、ppath VARCHAR(1000)) を作成します。

INSERT tmp1 SELECT *,lev,id FROM test WHERE parentid=idd;

 row_count()>0 の場合
する

lev=lev+1 を設定します。
tmp1 を挿入します。test t から t.*,lev,concat(a.ppath,t.id) を選択し、tmp1 a を t.parentid=a.id AND levv=LEV-1 で結合します。
 
終了しながら;
tmp1 から * を選択します。
 
終わり;
$$
 
区切り文字 ;
 
 usp_ser(0)を呼び出します。
 
/*
+------+----------+------+-------+
| id | 親id | levv | ppath |
+------+----------+------+-------+
| 1 | 0 | 1 | 1 |
| 4 | 0 | 1 | 4 |
| 2 | 1 | 2 | 12 |
| 3 | 1 | 2 | 13 |
| 5 | 2 | 3 | 125 |
| 7 | 3 | 3 | 137 |
| 6 | 5 | 4 | 1256 |
+------+----------+------+-------+*/

以下もご興味があるかもしれません:
  • MySQL 再帰クエリ ツリー テーブル子ノード、親ノードの特定の実装
  • MYSQLで再帰クエリを実装する方法
  • 再帰なしの PHP + MySQL 無限分類の例 (非再帰)
  • 再帰を使用してツリー構造のすべての子ノードを削除します (Java と MySQL によって実装)
  • 関数の再帰を使用して PHP と MySQL に基づく動的ツリー メニューを実装する
  • Java+MySQLの再帰を使用してツリー型のJSONリストを連結する方法の例
  • 無制限レベルの分類データ操作例を実現するための MySQL への PHP 再帰書き込み
  • Mysqlツリー再帰クエリの実装方法

<<:  2021年の花火効果をJSで描画(ソースコードダウンロード付き)

>>:  Dockerfileを使用して独自のイメージを作成する方法

推薦する

MySQL の基本クイックスタート知識のまとめ (マインドマップ付き)

目次序文1. データベースの基礎知識1. データベースとは何ですか? 2. データベースの分類3. ...

ブラウザをJavaScriptで対話させる方法

目次1. 最も単純な例2. 音声の速度とピッチをカスタマイズする3. 音量の調整方法4. よく使われ...

MySQL における IF()、IFNULL()、NULLIF()、および ISNULL() 関数の使用に関する詳細な説明

MySQL では、IF()、IFNULL()、NULLIF()、および ISNULL() 関数を使用...

Vue 要素と Nuxt の使用に関するヒントを共有する

1. 要素時間選択提出フォーマット変換例えば 2018年9月7日金曜日 00:00:00 GMT+0...

React+Amapは緯度と経度をリアルタイムで取得し、住所を特定します

目次1. マップを初期化する2. マップポイント3. 位置決めを有効にする4. マップの変更を監視す...

フロントエンドとバックエンド分離プロジェクトのDockerデプロイメントの実装例

目次1. 環境整備2. イメージを実行する問題を解決するRedis のインストールNginx のイン...

Docker で Spring-boot プロジェクトをデプロイするためのサンプル コード

1. 基本的な Spring-boot クイックスタート1.1 クイックスタート pom.xml は...

忘れられたMySQLパスワードとログインエラーの問題について簡単に説明します

MySQL ログイン パスワードを忘れた場合、解決方法は実はとても簡単です。MySQL メイン構成フ...

Linux カーネル デバイス ドライバー カーネル デバッグ テクニカル ノート集

/****************** * カーネルデバッグ技術 ****************...

CSS3 は下部に固定されたフッターを実装します (ページの高さに関係なく常に下部にあります)

序文フッター領域を下部に固定します。ページの高さや幅に関係なく、モバイル メニューと同様に、フッター...

Vue で円形プログレスバーを実装する例

データ表示は、常にあらゆる職業の人々が求めているものです。特にフロントエンド開発業界では、データを表...

Windows 10 + mysql 8.0.11 zipインストールチュートリアルの詳細

準備する: MySQL 8.0 Windows zip パッケージのダウンロード アドレス: htt...

nginx でネストされた if メソッドを実装する方法

Nginx はネストされた if ステートメントをサポートしておらず、if ステートメントでの論理判...

mysql8.0.14.zip のインストール中にデータ フォルダを自動的に作成できませんでした。サービスを開始できません。

今日システムを再インストールした後、コンピューターに mysql を再インストールし、ZIP ファイ...

Linux\Nginx 環境での仮想ドメイン名の設定とテスト検証

Nginx 仮想ドメイン名設定を使用すると、ドメイン名を購入せずに特定のドメイン名を介してローカル ...