UI設計したり、ウェブシステムを開発したりします。 

SQL見るだけクエリ#030 MYSQL UNION句で複数のSELECT文の結果を一つのテーブルに(応用編2)

記入日:2023-02-07 編集日:2023-02-07

SQL見るだけクエリ。今回は、MYSQL UNION句で複数のSELECT文の結果を一つのテーブル的に扱う際に、 複数のテーブルを結合する場合や、GROUP BYで最小値を取得するなど、条件を加える場合を考えてみようと思います。

今回は
複数の販売テーブルから、商品毎に、最低価格で販売した価格を取得するSQLを書いてみようと思います。

以下の様な5つのテーブルがあるとします。
1つ名は、商品毎のサイズが記録されたテーブル(table0)
その他4つは、商品の販売データが記録されたテーブル (table1,table2,table3,table4)です。


table0

id | item | size | status 
-- | ---- | ---- | ------
1  | AAAA | A1   | 1
2  | BBBB | A2   | 1
3  | CCCC | A3   | 1
4  | DDDD | A4   | 1

table1

id | item | price | status 
-- | ---- | ----- | ------
1  | AAAA | 20000 | 1
2  | BBBB | 17000 | 1


table2

id | item | price | status 
-- | ---- | ----- | ------
1  | CCCC | 22000 | 0
2  | DDDD | 18000 | 1



table3

id | item | price | status 
-- | ---- | ----- | ------
1  | EEEE | 20000 | 1
2  | BBBB | 12000 | 1


table4

id | item | price | status 
-- | ---- | ----- | ------
1  | CCCC | 18000 | 1
2  | EEEE | 11000 | 1

テーブル (table1,table2,table3,table4)で、各々statusが1のみ結合し、
itemの名称が同じもの同士をGROUP化、その際に値段の一番低いものを取得、
上記をtable0と結合し、最低価格をtabele0の各カラムと共に取得する。

// DB接続
$dsn = 'mysql:dbname=データベース名;host=localhost';
$user = 'ユーザー名';
$password = 'パスワード';
try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo '接続できませんでした。理由:'.$e->getMessage();
}
     
// SQL文
$sql = "SELECT c.* b.min_price FROM table0 AS c 
LEFT JOIN (SELECT item, MIN(a.price) AS min_price FROM";
$sql .= " (SELECT * FROM table1 WHERE status = 1";
$sql .= " UNION SELECT * FROM table2 WHERE status = 1";
$sql .= " UNION SELECT * FROM table3 WHERE status = 1";
$sql .= " UNION SELECT * FROM table4 WHERE status = 1";
$sql .= " ) AS a GROUP BY a.item) AS b";
$sql .= " ON c.item = b.item WHERE c.status = 1";
     
// 実行
$stmt = $dbh->query($sql);
     
// 結果を取得する
$results = $stmt->fetchAll(PDO::FETCH_ASSOC;
     
// 接続を閉じる
$dbh = null;

SQLの使いどころ

サイトに大量の情報を掲載することは、ユーザーにとってとても便利なことです。しかし、情報が多すぎると、目的の情報を見つけるのが困難になります。そのため、SQLを使用することで、情報を効率的に管理することができます。

SQLを使用することで、データベース内の情報を検索したり、フィルタリングしたりすることができます。これにより、ユーザーは目的の情報をスムーズかつ簡単に見つけることができます。

また、SQLを使用することで、データを集計したり、統合したりすることもできます。これにより、ユーザーはさまざまな視点から情報を分析することができます。つまり、サイトに多くの情報を掲載することが重要である一方で、その情報を効率的かつ簡単に管理することが求められる場合には、SQLが不可欠であるといえます。

KK

機械工学を専攻。工業デザイナーとして、国内及び海外の自動車・搬送ラインの設計などに従事した後、2003年にウェブシステム会社を設立。UI設計やウェブシステムの開発、DX化のディレクションなどを行っています。