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を使用したモバイルアプリケーションの構築プロセスの完全な記録

推薦する

CSSスクロールバーのスタイルをカスタマイズする方法の詳細な説明

この記事では、CSS スクロールバー セレクターを紹介し、Webkit ブラウザーと IE ブラウザ...

Linux で削除できないファイル/フォルダの解決方法

序文最近、弊社のサーバーがハッカーの攻撃を受け、一部のファイルの属性が変更されたため、ウイルスファイ...

Linux での MySQL データベースのアンインストール

Linux で MySQL データベースをアンインストールするにはどうすればいいですか? 以下では、...

Reactでコンポーネントロジックを共有する3つの方法

簡単に説明すると、これら 3 つの方法は、レンダリング プロップ、高階コンポーネント、カスタム フッ...

アーティストの自己啓発におけるいくつかの経験

会社の影響力が拡大し、製品が改良され続けるにつれて、関連するイメージデザインもそれに追いつき、徐々に...

TSオブジェクトのスプレッド演算子とレスト演算子の詳細な説明

目次概要オブジェクトの残り属性オブジェクトの拡張プロパティオブジェクトの浅いコピーを作成するkeyo...

要素の水平方向の中央揃えを実現する3つの方法と、固定レイアウトとフローレイアウトの概念の理解

CSS でテキストを中央揃えにするプロパティは非常に簡単に実現できます。text-align:cen...

MySQL で UTF-8 エンコーディングを使用しないのはなぜですか?

MySQL UTF-8 エンコーディングMySQL は 2003 年のバージョン 4.1 から U...

bashコマンドの使い方の詳細な説明

Linux では、基本的に vi エディタのように「.sh」拡張子を持つテキストの処理と実行を記述す...

あなたが知らない Linux KDE アプリケーション 11 選

翻訳Kool Desktop Environment の略称。 Linux、Unix、FreeBSD...

エージェントを介したzabbix監視プロセスとポートの詳細なプロセス

環境の紹介オペレーティングシステム: Centos 7.4 Zabbix バージョン: zabbix...

Linuxファイルを表示するコマンドの詳細な説明

Linuxファイルを表示する方法ファイルの内容を表示するコマンド: catは最初の行からコンテンツを...

Chrome をクラッシュさせる CSS コードの行

一般的な CSS コードでは、UI レイアウトや互換性に関して軽微な問題が発生するだけです。しかし、...

JavaScript でロジック判定コードを最適化する方法

序文日常生活で使用する論理的判断文には、if...else...、switch...case...、...

Linux でファイルのユーザーとグループを変更する方法

Linux では、ファイルが作成されると、そのファイルの所有者はファイルを作成したユーザーになります...