MySQLで複数の異なるテキストの出現回数を一度にカウントする方法
MySQLで複数の異なるテキストの出現回数を一度にカウントする方法
MySQLでは、集計関数COUNT()とIF()を組み合わせることで、複数の異なるテキストがそれぞれ何回出現しているかを、たった1つのクエリで同時にカウントできます。
仕組みはシンプルです。IF()関数は条件に一致した場合に「1」を返し、一致しない場合はNULLを返します。一方、COUNT()関数はNULLをカウント対象としないため、この性質を利用することで特定のテキストの出現回数だけを正確に集計できるのです。
それでは、実際にサンプルテーブルを作成して動作を確認していきましょう。
1. サンプルテーブルの作成
まず、技術系科目名を格納するテーブルを作成します。
mysql> create table CountOccurrencesDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> TechnicalSubject varchar(100)
-> );
Query OK, 0 rows affected (0.68 sec)
2. テストデータの挿入
次に、INSERT文を使ってレコードを挿入します。「Java」「MongoDB」「MySQL」といった値を重複させて登録しています。
mysql> insert into CountOccurrencesDemo(TechnicalSubject) values('Java');
Query OK, 1 row affected (0.14 sec)
mysql> insert into CountOccurrencesDemo(TechnicalSubject) values('MongoDB');
Query OK, 1 row affected (0.13 sec)
mysql> insert into CountOccurrencesDemo(TechnicalSubject) values('MySQL');
Query OK, 1 row affected (0.16 sec)
mysql> insert into CountOccurrencesDemo(TechnicalSubject) values('MySQL');
Query OK, 1 row affected (0.10 sec)
mysql> insert into CountOccurrencesDemo(TechnicalSubject) values('MySQL');
Query OK, 1 row affected (0.07 sec)
mysql> insert into CountOccurrencesDemo(TechnicalSubject) values('Java');
Query OK, 1 row affected (0.15 sec)
mysql> insert into CountOccurrencesDemo(TechnicalSubject) values('Java');
Query OK, 1 row affected (0.10 sec)
mysql> insert into CountOccurrencesDemo(TechnicalSubject) values('Java');
Query OK, 1 row affected (0.09 sec)
mysql> insert into CountOccurrencesDemo(TechnicalSubject) values('Java');
Query OK, 1 row affected (0.11 sec)
mysql> insert into CountOccurrencesDemo(TechnicalSubject) values('MongoDB');
Query OK, 1 row affected (0.21 sec)3. テーブルの内容を確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from CountOccurrencesDemo;
実行結果は以下の通りです。
+----+------------------+
| Id | TechnicalSubject |
+----+------------------+
| 1 | Java |
| 2 | MongoDB |
| 3 | MySQL |
| 4 | MySQL |
| 5 | MySQL |
| 6 | Java |
| 7 | Java |
| 8 | Java |
| 9 | Java |
| 10 | MongoDB |
+----+------------------+
10 rows in set (0.00 sec)
4. 出現回数をカウントするクエリ
ここからが本題です。以下のように、COUNT()の中にIF()をネストさせることで、「Java」「MySQL」「MongoDB」それぞれの出現回数を同時に取得できます。
mysql> select count(if(tbl.TechnicalSubject LIKE '%Java%',1,null)) as JavaOccurrence,
-> count(if(tbl.TechnicalSubject LIKE '%MySQL%',1,null)) as MySQLOccurrence,
-> count(if(tbl.TechnicalSubject LIKE '%MongoDB%',1,null)) as MongoDBOccurrence
-> from CountOccurrencesDemo tbl;
実行結果は以下の通りです。
+----------------+-----------------+-------------------+
| JavaOccurrence | MySQLOccurrence | MongoDBOccurrence |
+----------------+-----------------+-------------------+
| 5 | 3 | 2 |
+----------------+-----------------+-------------------+
1 row in set (0.05 sec)
結果の解説
上記の結果から、次のことが確認できます。
- Java:5件(Id 1、6、7、8、9)
- MySQL:3件(Id 3、4、5)
- MongoDB:2件(Id 2、10)
LIKE句にワイルドカード「%」を使用しているため、部分一致でもカウントされる点にも注目してください。例えば「JavaScript」のような値が含まれる場合も「%Java%」にマッチするため、厳密な完全一致でカウントしたい場合は「= 'Java'」のように等価比較を使うか、条件を見直す必要があります。
なお、MySQL 4.1以降ではSUM(CASE WHEN ...)やCOUNT(CASE WHEN ...)といった書き方でも同じ結果が得られるため、プロジェクトのコーディング規約に合わせて使い分けるとよいでしょう。
-
MySQLで複数のテーブルの行数(COUNT(*))を1つのクエリで取得する方法
MySQLでは、サブクエリを組み合わせることで、複数のテーブルの行数を1つのクエリで同時に取得できます。基本となる構文は以下の通りです。SELECT (SELECT COUNT(*) FROM テーブル名1) AS エイリアス名1, (SELECT COUNT(*) FROM テーブル名2) AS エイリアス名2 FROM dual;構文のポイント各テーブルに対して COUNT(*) を含むスカラーサブクエリを作成し、それらを SELECT 句の中に並べます。MySQLでは FROM dual を指定することで、実際のテーブルを参照しないままサブクエリを評価できます(なお、My
-
【MySQL】SUM()関数を使って単一クエリで特定の列値ごとの複数カウントを取得する方法
特定の列値に基づくカウントを1つのMySQLクエリで複数取得するには、集計関数SUM()を活用します。MySQLでは「列 = 値」という条件式が真なら1、偽なら0を返すため、その結果をSUM()で合計することで、条件に一致する行数を数えられます。まずはサンプル用のテーブルを作成しましょう。 mysql> create table DemoTable1790 ( Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, Name varchar(20), Score int ); Query OK, 0 rows af