2017年3月16日木曜日

MySQL JOIN による3つのテーブルを結合

つなぎ合わせるテーブル3つは下記のとおりです。

受注一覧テーブル
SELECT * FROM order_master;
+----+------------+-----------+
| id | product_id | vendor_id |
+----+------------+-----------+
|  1 |          1 |         2 |
|  2 |          2 |         1 |
|  3 |          4 |         3 |
|  4 |          3 |         2 |
+----+------------+-----------+

商品一覧テーブル
SELECT * FROM product_master;
+----+----------------+
| id | product_name   |
+----+----------------+
|  1 | 調味料A        |
|  2 | 調味料B        |
|  3 | 佃煮           |
|  4 | コーンフレーク |
+----+----------------+

配送業者テーブル
SELECT * FROM vendor_master;
+----+-------------+---------------------+
| id | vendor_name | contract_date       |
+----+-------------+---------------------+
|  1 | 東京配送    | 2017-03-03 00:00:00 |
|  2 | なにわ屋    | 2017-05-03 00:00:00 |
|  3 | 桃山Express | 2018-03-03 00:00:00 |
+----+-------------+---------------------+


① 配送業者テーブル(vendor_master)から、有効期限内である業者からの受注情報を取得します。有効期限を判定するには、配送業者テーブル(vendor_master)の contract_date が今日よりも大きい日付であることを調べます。

② ①の結果取得される配送業者テーブル(vendor_master)を、RIGHT OUTER JOIN で受注一覧テーブル(order_master)と結合します。

③ ②の結果と商品一覧テーブル(product_master)を結合します。

SQL 文はこちらです。

SELECT
 o.id '注文 ID'
 ,o.product_id '商品 ID'
 ,p.product_name '商品名'
 ,v.vendor_name '配送業者'
FROM
 order_master o
 RIGHT OUTER JOIN /*②の処理*/
 (SELECT id, vendor_name FROM vendor_master WHERE contract_date > CURDATE()) v /*①の処理*/
 ON
 o.vendor_id = v.id
 JOIN /*③の処理*/
 product_master p
 ON
 o.product_id = p.id
;

0 件のコメント:

コメントを投稿