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

MySQLのJOINとCASE式を活用して、データ駆動型テーブル間の関係を結合する方法

データベース設計では、通常は外部キーなどによる明示的なリレーションを持たせるのが望ましいですが、場合によってはテーブル間に関係を持たせず、クエリ実行時に動的に結合する必要が生じることがあります。このような「データ駆動型」のテーブルを結合するには、SELECT句の中でCASE式を使うことで、複数の結合パターンを柔軟に処理できます。

サンプルデータの準備

まず、学生の基本情報を格納する「Student_Detail」テーブルを見てみましょう。以下のようなデータが登録されています。

mysql> Select * from student_detail;
+----+---------+
| Id | Name    |
+----+---------+
| 1  | Harshit |
| 2  | Rahul   |
| 3  | Aarav   |
+----+---------+
3 rows in set (0.00 sec)

次に、学生ごとに個別のテーブルを作成し、それぞれの評価コメント(Remarks)を保存しているケースを考えます。ここでは「Student_Harshit」「Student_Rahul」「Student_Aarav」という3つのテーブルがあり、それぞれHarshit、Rahul、Aaravの評価が格納されています。

mysql> Select * from Student_Harshit;
+----+-----------+
| Id | Remarks   |
+----+-----------+
| 1  | Excellent |
+----+-----------+
1 row in set (0.00 sec)

mysql> Select * from Student_Rahul;
+----+---------+
| Id | Remarks |
+----+---------+
| 2  | Average |
+----+---------+
1 row in set (0.00 sec)

mysql> Select * from Student_Aarav;
+----+-------------+
| Id | Remarks     |
+----+-------------+
| 3  | Intelligent |
+----+-------------+
1 row in set (0.00 sec)

CASE式とLEFT JOINを組み合わせたクエリ

これらの分かれたテーブルを1つの結果セットにまとめるには、LEFT JOINですべてのテーブルを結合した上で、CASE式によって学生名に応じて適切なテーブルのRemarks列を選択します。以下のクエリを実行してみます。

mysql> Select sd.id, sd.name, CASE name WHEN 'Harshit' THEN H1.Remarks WHEN 'Rahul' THEN R1.Remarks WHEN 'Aarav' THEN A1.Remarks ELSE 'Error' END as REMARKS FROM Student_detail AS sd LEFT JOIN Student_Harshit AS H1 ON sd.id = H1.id LEFT JOIN Student_Rahul AS R1 ON sd.id = R1.id LEFT JOIN Student_Aarav AS A1 on sd.id = A1.id;
+----+---------+-------------+
| id | name    | REMARKS     |
+----+---------+-------------+
| 1  | Harshit | Excellent   |
| 2  | Rahul   | Average     |
| 3  | Aarav   | Intelligent |
+----+---------+-------------+
3 rows in set (0.00 sec)

クエリのポイント解説

  • LEFT JOINの使用: 各学生テーブルをId列をキーにLEFT JOINすることで、該当する行が存在しない場合でも、ベースとなるStudent_Detailの行は結果から失われません。
  • CASE式による振り分け: name列の値に応じて、対応するテーブルから取得したRemarksを返します。どの条件にも一致しない場合は「Error」という文字列を返すフォールバック処理も組み込まれています。

このようにCASE式を活用すれば、正規化されていないデータ駆動型のテーブル構成でも、柔軟にデータを統合して取得することが可能です。ただし、実際のシステム設計においては、このような構成はテーブル数の増加に伴って保守性や拡張性が低下しやすいため、単一のテーブルへ統合するか、適切なリレーション設計を行うことが推奨されます。

  1. MySQLで1日あたりのページ別訪問者数をカウントする方法を解説

    前提条件: あらかじめ「DBNAME」という名前のデータベースと、「tableName」という名前のテーブルが作成されているものとします。 1日あたりのページ別訪問者数を取得するには MySQLを使って、1日あたりのページごとの訪問者数を集計する方法を紹介します。これは、GROUP BY句を活用することで簡単に実現できます。 実行するクエリ SELECT DATE(date) Date, page_id, COUNT(*) colName FROM tableName GROUP BY DATE(date), page_id クエリの解説 このクエリでは、以下のような処理が行われます。 col

  2. PythonでMySQLのテーブルを丸ごとコピーする方法をわかりやすく解説

    Pythonを使えば、MySQLに存在する既存テーブルのコピーを簡単に作成できます。コピーには、カラム(列)やその定義、テーブル内のすべての行データが含まれます。基本構文CREATE TABLE table_name SELECT * FROM existing_tabletable_name:新しく作成するテーブルの名前existing_table:コピー元となる既存テーブルの名前PythonでMySQLのテーブルをコピーする手順MySQLコネクタ(mysql.connector)をインポートするconnect() メソッドでデータベースへの接続を確立するcursor() メソッドでカーソル