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

推薦する

MySql5.x を MySql8.x にアップグレードする方法と手順

MySQL 5.x と MySQL 8.0.X のいくつかの違いapplication.proper...

Docker で Elasticsearch Kibana と ik Word Segender をデプロイする詳細な説明

esインストール docker pull elasticsearch:7.4.0 # -d : バッ...

Chrome デベロッパー ツールの詳細な紹介 - タイムライン

1. 概要ユーザーは、アクセスする Web アプリケーションがインタラクティブでスムーズに実行される...

CentOS 6 または CentOS 7 でディスク領域をクリアする方法

以下は、CentOS 6 または CentOS 7 サーバーのディスク領域をクリアするための簡単なコ...

MySQL Installer Community 5.7.16 インストール詳細チュートリアル

この記事では、MySQL インストールの詳細なチュートリアルを記録し、全員と共有します。 1. バー...

Linux 上での Go 環境の構築のインストールと設定の説明

Linux で Go 環境を構築するのは非常に簡単です。 1. go1.2.1.linux-386....

MYSQL における char と varchar の違い

CHAR 型と VARCHAR 型は似ていますが、主に格納場所、末尾のスペース、取得方法が異なります...

JavaScript スタイル オブジェクトと CurrentStyle オブジェクトのケース スタディ

1. スタイルオブジェクトスタイル オブジェクトは単一のスタイル宣言を表し、スタイルが適用されている...

高可用性 Web クラスターを実装するための Keepalived+Nginx+Tomcat サンプル コード

高可用性 Web クラスターを実現する Keepalived+Nginx+Tomcat 1. Ngi...

JavaScript の基本変数

目次1. 変数の概要1.1 変数のメモリへの保存1.2 変数の使用1. 変数を宣言する2. 譲渡3....

画像をラベルとして使用すると、IE では for 属性が機能しません。

例えば:コードをコピーコードは次のとおりです。 <input type="check...

ウェブデザイナーが知っておくべき効率的なナビゲーションデザインの3つの原則

ウェブサイトのナビゲーションを設計することは、家の基礎を築くようなものです。基礎がしっかりしていなけ...

Centos7 への MySQL8 のインストールチュートリアル

MySQL 8 の新機能: MySQL をバージョン 5.x から 8.x に直接アップグレードする...

HTML に CSS を導入するいくつかの方法の紹介

目次1. HTMLタグ要素にCSSスタイルを直接埋め込む2. HTMLのheadセクションにおけるス...

MySQLシリーズ マルチテーブル結合クエリ92および99構文例詳細チュートリアル

目次1. デカルト積現象2. 接続クエリの知識ポイントのまとめ1) 結合クエリとは何ですか? 2) ...