MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLで再帰的なSELECTクエリを実行する方法【初心者向けに具体例つきで解説】

MySQLでは、ユーザー定義変数(セッション変数)を活用することで、再帰的なSELECTクエリを実現できます。本記事では、実際にテーブルを作成し、データを挿入したうえで、再帰的なSELECTの具体的な書き方を順を追って解説します。

1. サンプルテーブルの作成

まず、再帰的なSELECTを試すためのサンプルテーブルを作成します。テーブルの作成にはCREATEコマンドを使用します。

mysql> CREATE table tblSelectDemo
   - > (
   - > id int,
   - > name varchar(100)
   - > );
Query OK, 0 rows affected (0.61 sec)

ここでは、「id」と「name」という2つのカラムを持つテーブル「tblSelectDemo」を作成しました。

2. テーブルへのデータ挿入

続いて、作成したテーブル「tblSelectDemo」にレコードを挿入していきます。INSERT INTO文を使用して、5件の学生データを登録します。

mysql> insert into tblSelectDemo values(1,'John');
Query OK, 1 row affected (0.10 sec)

mysql> insert into tblSelectDemo values(2,'Carol');
Query OK, 1 row affected (0.09 sec)

mysql> insert into tblSelectDemo values(3,'Smith');
Query OK, 1 row affected (0.17 sec)

mysql> insert into tblSelectDemo values(4,'David');
Query OK, 1 row affected (0.15 sec)

mysql> insert into tblSelectDemo values(5,'Bob');
Query OK, 1 row affected (0.18 sec)

3. 登録された全レコードの確認

すべてのレコードが正しく登録されているか確認してみましょう。

mysql> SELECT *from tblSelectDemo;

実行結果は以下のとおりです。

+------+-------+
| id   | name  |
+------+-------+
|    1 | John  |
|    2 | Carol |
|    3 | Smith |
|    4 | David |
|    5 | Bob   |
+------+-------+
5 rows in set (0.00 sec)

4. 再帰的なSELECTクエリの書き方

それが本題となる、再帰的なSELECTの構文です。ポイントは、@sessionNameというユーザー定義変数を使い、JOIN句の中で変数を初期化しながら、WHERE句で条件を再帰的に評価していく点にあります。

mysql> SELECT var1.id as id, @sessionName:= var1.Name as NameofStudent
   - > from (select * from tblSelectDemo order by id desc) var1
   - > join
   - > (select @sessionName:= 4)tmp
   - > where var1.id = @sessionName;

このクエリの処理の流れを簡単に説明すると、以下のようになります。

  • サブクエリでテーブルの内容を「id」の降順に並べ替えます。
  • JOIN先のサブクエリで、セッション変数「@sessionName」を初期値「4」に設定します。
  • WHERE句で「var1.id = @sessionName」という条件により、該当するレコードだけが抽出されます。
  • 同時に「@sessionName := var1.Name」によって、変数に取得した値が代入されます。

実行結果は以下のとおりです。

+------+----------------+
| id   | NameofStudent  |
+------+----------------+
|    4 | David          |
+------+----------------+
1 row in set (0.00 sec)

まとめ

MySQLで再帰的なSELECTを行う場合は、ユーザー定義変数(@変数名)とJOIN・WHERE句を組み合わせることで実現できます。今回の例のように、開始条件となるIDを変数に設定しておけば、階層構造のデータや連鎖的な参照が必要な場面でも柔軟に対応できます。なお、MySQL 8.0以降では「WITH RECURSIVE」句を使ったより直感的な再帰クエリも利用できるため、環境に応じて使い分けるとよいでしょう。

  1. MySQLで0を末尾に回して並べ替える!条件付きSELECTとORDER BYの使い方

    MySQLでは、ORDER BY句に「カラム名=0」という条件式を組み合わせることで、0以外の値を昇順に並べたうえで、0のレコードだけを末尾にまとめて表示できます。この記事では、その具体的な書き方と実行例を分かりやすく解説します。基本構文select * from yourTableName order by yourColumnName=0, yourColumnName;この構文のポイントは、yourColumnName=0 がブール値として評価される点です。値が0であれば「1(真)」、0以外であれば「0(偽)」となるため、昇順ソートでは0以外の値の行が先に並び、その後ろに0の行が配置され

  2. MySQLで月を指定してデータを抽出する方法(MONTH()関数の使い方)

    MySQLで日付データから特定の「月」に該当するレコードだけを抽出したい場合は、MONTH()関数を使うのが便利です。この記事では、実際にテーブルを作成し、サンプルデータを挿入しながら、月を条件にしたSELECT文の書き方を具体的に解説します。1. サンプルテーブルの作成まずは、出荷日(Shippingdate)を格納するdatetime型のカラムを持つテーブルを作成します。mysql> create table DemoTable1599    -> (    -> Shippingdate d