MySQL8の再帰メソッドの使い方を教える

MySQL8の再帰メソッドの使い方を教える

以前、カスタム関数を使用して MySQL でツリー構造を再帰的にクエリする方法についての記事を書きました。MySQL 8.0 以降、再帰クエリ構文がようやくサポートされるようになりました。

熱膨張係数

まず、CTEとは何かを理解しましょう。正式名称はCommon Table Expressionsです。

と
 cte1 AS (テーブル1からa、bを選択)
 cte2 AS (テーブル2からc、dを選択)
cte1からb、dを選択し、cte2に結合します。
ここで cte1.a = cte2.c;

cte1、cte2は定義したCTEであり、現在のクエリで参照できます。

CTE は派生テーブルに似た一時的な結果セットであることがわかります。両者の違いについてはここでは詳しく説明しません。MySQL 開発ドキュメントを参照してください: https://dev.mysql.com/doc/refman/8.0/en/with.html#common-table-expressions-recursive-examples

再帰クエリ

まず、再帰クエリの構文を見てみましょう。

再帰的なcte_name AS
(
  SELECT ... -- 初期行セットを返す
  UNION ALL / UNION DISTINCT
  SELECT ... -- 追加の行セットを返す
)
cteから*を選択します。
  • 最終的な結果セットが、必要な「再帰ツリー構造」である CTE を定義します。RECURSIVE は、現在の CTE が再帰的であることを意味します。
  • 最初のSELECTは「初期結果セット」です
  • 2番目のSELECTは再帰部分であり、「最初の結果セット/最後の再帰によって返された結果セット」を使用して「新しい結果セット」を照会して取得します。
  • 再帰結果セットが null を返すと、クエリは終了します。
  • 最後に、UNION ALL は上記の手順ですべての結果セットを結合し (UNION DISTINCT は重複を削除します)、SELECT * FROM cte; を通じてすべての結果セットを取得します。

再帰部分には以下を含めることはできません。

  • SUM() などの集計関数
  • グループ化
  • 注文する
  • 制限
  • 明確な

上記の説明は少し抽象的かもしれませんので、例を通してゆっくり理解していきましょう。

WITH RECURSIVE cte (n) AS -- ここで定義されたnは結果セットの列名と同等であり、次のクエリでも定義できます(
 選択1
 ユニオンオール
 n + 1 をテーブルから選択する (n < 5)
)
cteから*を選択します。


 - 結果
+------+
| いいえ |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+------+

  • 初期結果セットはn = 1です
  • 次に、再帰部分を見てみましょう。CTE が初めて実行されると、結果セットは n = 1 になります。n < 5 という条件が満たされていないことがわかったので、n + 1 が返されます。
  • 再帰部分は2回目に実行され、CTE結果セットはn = 2になります。条件が満たされなくなるまで再帰が行われます。
  • 最後に結果セットをマージします


最後に、ツリー構造の例を見てみましょう。

テーブル `c_tree` を作成します (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `cname` varchar(255) COLLATE utf8mb4_unicode_ci デフォルト NULL,
 `parent_id` int(11) デフォルト NULL,
 主キー (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 デフォルト CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
mysql> c_tree から * を選択します。
+----+---------+-----------+
| id | cname | 親 ID |
+----+---------+-----------+
| 1 | 1 | 0 |
| 2 | 2 | 0 |
| 3 | 3 | 0 |
| 4 | 1-1 | 1 |
| 5 | 1-2 | 1 |
| 6 | 2-1 | 2 |
| 7 | 2-2 | 2 |
| 8 | 3-1 | 3 |
| 9 | 3-1-1 | 8 |
| 10 | 3-1-2 | 8 |
| 11 | 3-1-1-1 | 9 |
| 12 | 3-2 | 3 |
+----+---------+-----------+
マイSQL> 
RECURSIVE tree_cte として
(
  parent_id = 3 の c_tree から * を選択
  ユニオンオール
  c_tree t から t.* を選択し、tree_cte tcte を t.parent_id = tcte.id で内部結合します。
)
tree_cte から * を選択します。
+----+---------+-----------+
| id | cname | 親 ID |
+----+---------+-----------+
| 8 | 3-1 | 3 |
| 12 | 3-2 | 3 |
| 9 | 3-1-1 | 8 |
| 10 | 3-1-2 | 8 |
| 11 | 3-1-1-1 | 9 |
+----+---------+-----------+
  • 初期結果セット R0 = select * from c_tree where parent_id = 3
  • 再帰部分では、R0とc_treeの最初の内部結合がR1を取得するために使用されます。
  • R1はc_treeと内部結合されてR2となる。
  • ...
  • すべての結果セットR0 + ... + Riをマージします

詳細情報

https://dev.mysql.com/doc/refman/8.0/en/with.html

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MySQLはカスタム関数を使用して親IDまたは子IDを再帰的に照会します
  • Mysqlツリー再帰クエリの実装方法
  • 無制限レベルの分類データ操作例を実現するための MySQL への PHP 再帰書き込み
  • 再帰を使用してツリー構造のすべての子ノードを削除します (Java と MySQL によって実装)
  • MySQLの再帰問題
  • 再帰なしの PHP + MySQL 無限分類の例 (非再帰)
  • MySQL 再帰クエリ ツリー テーブル子ノード、親ノードの特定の実装

<<:  Windows Server 2019 IIS10.0+PHP(FastCGI)+MySQL 環境構築チュートリアル

>>:  Vue Nativeを使用したモバイルアプリケーションの構築プロセスの完全な記録

推薦する

衝突検出を実装するためのjs

この記事の例では、衝突検出を実装するためのjsの具体的なコードを参考までに共有しています。具体的な内...

MySQL コマンドラインモードアクセス操作 MySQL データベース操作

使用環境cmd モードで、mysql --version と入力します (インストールされている M...

MySQL 8.0.12 のインストールと設定のグラフィックチュートリアル

MySQL 8.0.12 のダウンロードとインストールのチュートリアルを録画し、全員と共有しました。...

MySQL 8.0.11 MacOS 10.13 のインストールと設定方法のグラフィックチュートリアル

MacにMySQLデータベースをインストールし、環境変数を設定する手順を参考までに記録します。具体的...

Alibaba Cloud ESC に MYSQL8.0 をインストールするチュートリアル

接続ツールを開きます。私はMobaXterm_Personal_12.1を使用します(公式サイトのダ...

JavaScript 関数のカリー化

目次1 関数カリー化とは何ですか? 2 カレーの役割と特徴2.1 パラメータの再利用2.2 早期復帰...

CentOS 8/RHEL 8 に Cockpit をインストールして使用する方法

Cockpit は、CentOS および RHEL システムで使用できる Web ベースのサーバー管...

広告を閉じるための JavaScript カウントダウン

広告を閉じるまでのカウントダウンを実装するために JavaScript を使用するまだフロントエンド...

vue3 再帰コンポーネントカプセル化の全プロセス記録

目次序文1. 再帰コンポーネント2. 右クリックメニューコンポーネント要約する序文今日、プロジェクト...

JSONObject の使用方法の詳細な説明

JSONObject は単なるデータ構造であり、JSON 形式のデータ構造 ( key-value構...

MySQLでANDとORを組み合わせる問題を解決する

以下のように表示されます。 SELECT prod_name,prod_price FROM pro...

Linux仮想マシンをWiFiに接続する方法

生活の中で、インターネットはどこにでもあります。インターネットを通じてゲームをしたり、テレビ番組を見...

TypeScript マッピング型の詳細

目次1. マップされた型2. マッピング修飾子3. キーの再マッピング4. さらなる探究序文: Ty...

vue+elementui+vuex+sessionStorage を使用して履歴タグ メニューを実装するためのサンプル コード

一般的には、左側にメニューがあった後、ページの上部に履歴タブ メニューを追加する必要があります。他の...