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 フルバックアップ、マスタースレーブレプリケーション、カスケードレプリケーション、および半同期の概要

MySQL フルバックアップ1. バイナリログを有効にし、データベースから分離して別々に保存する v...

MySQL 最適化 query_cache_limit パラメータの説明

クエリキャッシュ制限query_cache_limit は、単一のクエリで使用できるバッファ サイズ...

Vueのミックスインと継承について詳しく説明します

目次序文ミキシンMixin ノート (重複名)ローカルミックスイングローバル ミックスイン継承するミ...

ネイティブ js カスタム右クリック メニュー

この記事の例では、参考のためにjsカスタム右クリックメニューの具体的なコードを共有しています。具体的...

1 つの記事で Nginx ロケーション マッチングの実装を理解する

チームはフロントエンドとバックエンドを分離しているため、フロントエンドが Nginx とノード層を引...

Nginx レイヤー 4 負荷分散構成ガイド

1. レイヤー4負荷分散の概要レイヤー 4 ロード バランシングとは何ですか?いわゆる 4 層負荷分...

Vue3 における ref と reactive の詳細な説明と拡張

目次1. 参照と反応1. 反応的2.参照2. shallowRef と shallowReactiv...

Vue はアップロードされた画像に透かしを追加する機能を実装します

この記事では、Vueでアップロードされた画像に透かしを追加する具体的な実装コードを参考までに共有しま...

HTMLの水平線注釈とコードコメントの使い方をマスターするだけです

水平線<hr /> タグを使用して、現在の位置に水平の分割線を描画します。例: XML/...

Elasticsearch を使用する際の一般的な問題の解決策

1. redis で使用すると Netty の起動競合が発生するため、***Application ...

Vueはカスタム命令を使用してページの下部に透かしを追加します

プロジェクトシナリオプロジェクトの背景全体にカスタム透かしを追加します。透かしのテキスト、フォントの...

RHEL7.5 mysql 8.0.11 インストールチュートリアル

この記事はRHEL7.5でのMySQL 8.0.11のインストールチュートリアルを記録しています。具...

Ubuntu 16.4 で完全に分散された Hadoop 環境を構築するための実践的なチュートリアル

序文この記事は主にubantu 16.4 Hadoop完全分散構築に関する関連コンテンツを紹介し、皆...

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

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

JS ES 新機能テンプレート文字列

目次1. テンプレート文字列とは何ですか? 2. 複数行のテンプレート文字列2.1 式付きテンプレー...