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

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

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

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

基本的な結合方法(UNION句で複数結合)

$sql = "SELECT * FROM table1 UNION SELECT * FROM table2 
UNION SELECT * FROM table3"; 
$result = mysql_query($sql); 

この考え方で以下の様なテーブルを結合できます。

テーブル1

id | name | age
-- | ---- | ---
1  | John | 20
2  | Amy  | 18


テーブル2

id | name | age
-- | ---- | ---
3  | Tom  | 22
4  | Steve| 25


テーブル3

id | name | age
-- | ---- | ---
5  | Sarah| 30
6  | Mike | 32


結合後のデータ

id | name | age
-- | ---- | ---
1  | John | 20
2  | Amy  | 18
3  | Tom  | 22
4  | Steve| 25
5  | Sarah| 30
6  | Mike | 32

具体的な使い方としては以下のような感じでしょうか

// DB接続
$dsn = 'mysql:dbname=データベース名;host=localhost';
$user = 'ユーザー名';
$password = 'パスワード';
try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo '接続できませんでした。理由:'.$e->getMessage();
}

// SQL文
$sql = "SELECT * FROM table1 UNION SELECT * FROM table2 
UNION SELECT * FROM table3";

// 実行
$stmt = $dbh->query($sql);

// 結果を取得する
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    echo $row['id']." ";
    echo $row['name']." ";
    echo $row['age']."
"; } // 接続を閉じる $dbh = null;

結合するテーブルが多くなる場合は、
以下のようにしておくと良いかもしれません

// DB接続
$dsn = 'mysql:dbname=データベース名;host=localhost';
$user = 'ユーザー名';
$password = 'パスワード';
try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo '接続できませんでした。理由:'.$e->getMessage();
}

// SQL文
$sql = "SELECT * FROM table1";
$sql .= " UNION SELECT * FROM table2";
$sql .= " UNION SELECT * FROM table3";
$sql .= " UNION SELECT * FROM table4";
$sql .= " UNION SELECT * FROM table5";

// 実行
$stmt = $dbh->query($sql);

// 結果を取得する
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    echo $row['id']." ";
    echo $row['name']." ";
    echo $row['age']."
"; } // 接続を閉じる $dbh = null;

UNION句を使う際に、
テーブルの取得条件を加えるには

結合前のテーブルに条件を加える場合の例

// DB接続
$dsn = 'mysql:dbname=データベース名;host=localhost';
$user = 'ユーザー名';
$password = 'パスワード';
try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo '接続できませんでした。理由:'.$e->getMessage();
}

// SQL文
$sql = "SELECT * FROM table1 WHERE name='John'";
$sql .= " UNION SELECT * FROM table2 WHERE age > 20";
$sql .= " UNION SELECT * FROM table3 WHERE age < 25";
$sql .= " UNION SELECT * FROM table4";
$sql .= " UNION SELECT * FROM table5 GROUP BY age";

// 実行
$stmt = $dbh->query($sql);

// 結果を取得する
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    echo $row['id']." ";
    echo $row['name']." ";
    echo $row['age']."
"; } // 接続を閉じる $dbh = null;

結合後のテーブルに条件を加える場合の例

// DB接続
$dsn = 'mysql:dbname=データベース名;host=localhost';
$user = 'ユーザー名';
$password = 'パスワード';
try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo '接続できませんでした。理由:'.$e->getMessage();
}

// SQL文
$sql = "SELECT * FROM (
SELECT * FROM table1 
UNION SELECT * FROM table2 
UNION SELECT * FROM table3 
UNION SELECT * FROM table4 
UNION SELECT * FROM table5)";
$sql .= " WHERE name='John' OR age > 20 OR age < 25 GROUP BY age";

// 実行
$stmt = $dbh->query($sql);

// 結果を取得する
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    echo $row['id']." ";
    echo $row['name']." ";
    echo $row['age']."
"; } // 接続を閉じる $dbh = null;

SQLの使いどころ

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

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

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

KK

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