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 | +------+----------+------+-------+*/ 以下もご興味があるかもしれません:
|
<<: 2021年の花火効果をJSで描画(ソースコードダウンロード付き)
>>: Dockerfileを使用して独自のイメージを作成する方法
目次序文1. データベースの基礎知識1. データベースとは何ですか? 2. データベースの分類3. ...
目次1. 最も単純な例2. 音声の速度とピッチをカスタマイズする3. 音量の調整方法4. よく使われ...
MySQL では、IF()、IFNULL()、NULLIF()、および ISNULL() 関数を使用...
1. 要素時間選択提出フォーマット変換例えば 2018年9月7日金曜日 00:00:00 GMT+0...
目次1. マップを初期化する2. マップポイント3. 位置決めを有効にする4. マップの変更を監視す...
目次1. 環境整備2. イメージを実行する問題を解決するRedis のインストールNginx のイン...
1. 基本的な Spring-boot クイックスタート1.1 クイックスタート pom.xml は...
MySQL ログイン パスワードを忘れた場合、解決方法は実はとても簡単です。MySQL メイン構成フ...
/****************** * カーネルデバッグ技術 ****************...
序文フッター領域を下部に固定します。ページの高さや幅に関係なく、モバイル メニューと同様に、フッター...
データ表示は、常にあらゆる職業の人々が求めているものです。特にフロントエンド開発業界では、データを表...
準備する: MySQL 8.0 Windows zip パッケージのダウンロード アドレス: htt...
Nginx はネストされた if ステートメントをサポートしておらず、if ステートメントでの論理判...
今日システムを再インストールした後、コンピューターに mysql を再インストールし、ZIP ファイ...
Nginx 仮想ドメイン名設定を使用すると、ドメイン名を購入せずに特定のドメイン名を介してローカル ...