MySQLでUNIONクエリの結果をカウントする方法を徹底解説
MySQLでは、UNION(ユニオン)で結合した結果セットの件数を取得したい場面がよくあります。本記事では、サブクエリとCOUNT(*)関数を組み合わせて、UNIONの結果をカウントする方法を具体例とともに解説します。
UNIONの結果をカウントする基本構文
UNIONの結果件数を取得するには、UNIONクエリをFROM句の中にサブクエリとして記述し、その外側でCOUNT(*)を実行します。基本となる構文は以下の通りです。
SELECT COUNT(*)
FROM
(
SELECT yourColumName1 FROM yourTableName1
UNION
SELECT yourColumName1 FROM yourTableName2
) anyVariableName;
ポイントは、UNIONを含むSELECT文全体を括弧で囲み、任意の別名(エイリアス)を付けることです。MySQLではサブクエリに必ず別名が必要なため、「anyVariableName」のような名前を付けておきましょう。
動作確認用のサンプルテーブルを作成する
それでは、実際にテーブルを作成して動作を確認してみましょう。まずは1つ目のテーブル「union_Table1」を作成します。
mysql> create table union_Table1 -> ( -> UserId int -> ); Query OK, 0 rows affected (0.47 sec)
union_Table1にデータを挿入
INSERTコマンドを使って、レコードを3件追加します。
mysql> insert into union_Table1 values(1); Query OK, 1 row affected (0.18 sec) mysql> insert into union_Table1 values(10); Query OK, 1 row affected (0.12 sec) mysql> insert into union_Table1 values(20); Query OK, 1 row affected (0.09 sec)
SELECT文ですべてのレコードを表示してみます。
mysql> select *from union_Table1;
実行結果は以下のようになります。
+--------+ | UserId | +--------+ | 1 | | 10 | | 20 | +--------+ 3 rows in set (0.00 sec)
2つ目のテーブルを作成してデータを挿入
続いて、2つ目のテーブル「union_Table2」を作成します。
mysql> create table union_Table2 -> ( -> UserId int -> ); Query OK, 0 rows affected (0.69 sec)
こちらにもINSERTコマンドでレコードを追加します。なお、1つ目のテーブルと同じ値「1」も意図的に含めています。
mysql> insert into union_Table2 values(1); Query OK, 1 row affected (0.12 sec) mysql> insert into union_Table2 values(30); Query OK, 1 row affected (0.26 sec) mysql> insert into union_Table2 values(50); Query OK, 1 row affected (0.13 sec)
SELECT文で内容を確認します。
mysql> select *from union_Table2;
実行結果は以下の通りです。
+--------+ | UserId | +--------+ | 1 | | 30 | | 50 | +--------+ 3 rows in set (0.00 sec)
UNIONクエリのカウントを実行する
準備が整ったので、いよいよUNIONクエリの結果をカウントしてみます。両テーブルには重複するレコード(UserId = 1)が存在しますが、通常のUNIONは重複行を自動的に除外し、同じ値は1回だけカウントされます。
mysql> select count(*) as UnionCount from -> ( -> select distinct UserId from union_Table1 -> union -> select distinct UserId from union_Table2 -> )tbl1;
実行結果は以下のようになります。
+------------+ | UnionCount | +------------+ | 5 | +------------+ 1 row in set (0.00 sec)
結果の解説
各テーブルは3件ずつのデータを持っていますが、両方に存在する「1」が重複しているため、UNION後のユニークな値は「1」「10」「20」「30」「50」の5件となります。そのため、UnionCountの結果は「5」と表示されました。
ちなみに、重複したレコードも含めてすべてカウントしたい場合は、UNIONの代わりにUNION ALLを使用します。この場合、結果は6件(3件+3件)となります。用途に応じて使い分けるとよいでしょう。
-
MySQLの1つのクエリで複数テーブルの行数を同時にカウントする方法
はじめに MySQLでは、サブクエリ(スカラーサブクエリ)を組み合わせることで、1つのSELECT文で複数のテーブルの行数を同時に取得できます。この記事では、実際にテーブルを作成し、データを挿入して、2つのテーブルの行数を1回のクエリでカウントする手順を解説します。 手順1:1つ目のテーブルを作成する まず、以下のようにテーブルを作成します。 mysql> create table DemoTable1 ( Name varchar(40) ); Query OK, 0 rows affected (0.81 sec) レコードの挿入 INSERTコマンドを使って、いくつかの
-
MySQLクエリでCASE条件を使ってカウントする方法
MySQLでは、CASE WHENを活用し、COUNT()関数の中にCASE条件を設定することで、特定の条件に一致するレコードだけを数えることができます。この仕組みが成り立つのは、COUNT()関数がNULL値を無視するためです。条件に合わない場合にNULLを返すことで、そのレコードはカウント対象から除外されます。1. サンプルテーブルの作成まず、以下のコマンドでテーブルを作成します。 ); Query OK, 0 rows affected (0.61 sec)2. レコードの挿入続いて、insertコマンドを使ってテーブルにデータを登録します。mysql> insert into D