MySQLで2つの異なる条件に基づいてカウントを取得するクエリの書き方
MySQLで、2つの異なる条件を組み合わせたカウント(集計)を行いたい場合は、CASE文を使用するのが効果的です。この記事では、学生の点数(StudentMarks)と有効フラグ(isValid)を持つテーブルを例に、条件付きカウントの実装方法をテーブル作成から順を追って解説します。
サンプルテーブルの作成
まず、CREATE TABLE文でテーブルを作成します。
mysql> create table DemoTable -> ( -> StudentMarks int, -> isValid tinyint(1) -> ); Query OK, 0 rows affected (0.68 sec)
テストデータの挿入
次に、INSERTコマンドを使ってレコードを挿入します。
mysql> insert into DemoTable values(45,0); Query OK, 1 row affected (0.15 sec) mysql> insert into DemoTable values(78,1); Query OK, 1 row affected (0.26 sec) mysql> insert into DemoTable values(45,1); Query OK, 1 row affected (0.31 sec) mysql> insert into DemoTable values(78,1); Query OK, 1 row affected (0.22 sec) mysql> insert into DemoTable values(45,0); Query OK, 1 row affected (0.17 sec) mysql> insert into DemoTable values(82,1); Query OK, 1 row affected (0.12 sec) mysql> insert into DemoTable values(62,1); Query OK, 1 row affected (0.14 sec)
登録データの確認
SELECT文でテーブル内のすべてのレコードを表示してみましょう。
mysql> select *from DemoTable;
出力結果
+--------------+---------+ | StudentMarks | isValid | +--------------+---------+ | 45 | 0 | | 78 | 1 | | 45 | 1 | | 78 | 1 | | 45 | 0 | | 82 | 1 | | 62 | 1 | +--------------+---------+ 7 rows in set (0.00 sec)
2つの条件でカウントを取得するクエリ
以下が、2つの別々の条件に基づいてカウントを取得するクエリです。このクエリのポイントは、StudentMarksが45の場合はisValidが1のレコードのみをカウントし、それ以外の点数の場合はすべてのレコードをカウントするという入れ子構造のCASE文になっている点です。
mysql> select StudentMarks, -> sum(case -> when StudentMarks=45 -> then case when isValid = 1 then 1 else 0 end -> else 1 end -> ) AS Freq -> from DemoTable -> group by StudentMarks;
出力結果
+--------------+------+ | StudentMarks | Freq | +--------------+------+ | 45 | 1 | | 78 | 2 | | 82 | 1 | | 62 | 1 | +--------------+------+ 4 rows in set (0.00 sec)
出力結果を見ると、点数45の行は3件存在しますが、isValidが1のレコードは1件だけなので「Freq」は1となっています。一方、点数78や82などそれ以外の点数については、フラグの値に関係なくすべてカウントされています。
このように、CASE文をSUM関数やCOUNT関数と組み合わせ、GROUP BYでグループ化することで、単純な件数集計では実現できない柔軟な条件付きカウントを簡単に実装できます。集計処理で複雑な条件分岐が必要になった際は、ぜひこの手法を活用してください。
-
MySQLで0を末尾に回して並べ替える!条件付きSELECTとORDER BYの使い方
MySQLでは、ORDER BY句に「カラム名=0」という条件式を組み合わせることで、0以外の値を昇順に並べたうえで、0のレコードだけを末尾にまとめて表示できます。この記事では、その具体的な書き方と実行例を分かりやすく解説します。基本構文select * from yourTableName order by yourColumnName=0, yourColumnName;この構文のポイントは、yourColumnName=0 がブール値として評価される点です。値が0であれば「1(真)」、0以外であれば「0(偽)」となるため、昇順ソートでは0以外の値の行が先に並び、その後ろに0の行が配置され
-
2つのテーブルに対する単一のMySQL SELECTクエリは可能ですか?
はい、可能です。FROM句にカンマ区切りで複数のテーブル名を指定することで、単一のSELECTクエリで2つのテーブルからデータを取得できます。基本的な構文は以下の通りです。select * from yourTableName1,yourTableName2;なお、この書き方では両テーブルの全行が組み合わされた「クロス結合(直積)」の結果が返される点に注意してください。サンプルテーブルの作成まず、1つ目のテーブルを作成します。mysql> create table DemoTable1 -> ( &nb