MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLでグループごとの最小値を複数取得するクエリの書き方

MySQLで「名前ごとなど、グループ単位の最小値」を一度に取得したい場面はよくあります。そんなときは、サブクエリとMIN()関数を組み合わせることで簡単に実現できます。この記事では、各人物の最も低いスコアを抽出する具体的手順を、テーブル作成から順に解説します。

サンプルテーブルの作成

まず、CREATE TABLE文でテスト用のテーブルを作成します。

mysql> create table DemoTable
    -> (
    -> Name varchar(20),
    -> Score int
    -> );
Query OK, 0 rows affected (0.56 sec)

テストデータの挿入

続いて、INSERT文でレコードを追加していきます。JohnとChrisそれぞれに複数のスコアを登録します。

mysql> insert into DemoTable values('John',56);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values('John',45);
Query OK, 1 row affected (0.24 sec)
mysql> insert into DemoTable values('John',58);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('Chris',43);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('Chris',38);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('Chris',87);
Query OK, 1 row affected (0.14 sec)

登録データの確認

SELECT文で全レコードを表示し、データが正しく登録されているか確認しましょう。

mysql> select *from DemoTable;

実行結果は以下の通りです。

+-------+-------+
| Name  | Score |
+-------+-------+
| John  |    56 |
| John  |    45 |
| John  |    58 |
| Chris |    43 |
| Chris |    38 |
| Chris |    87 |
+-------+-------+
6 rows in set (0.00 sec)

グループごとの最小値を取得するクエリ

ここからが本題です。以下のように相関サブクエリの中でMIN()を使うことで、各名前ごとの最小スコアをまとめて取得できます。

mysql> select *from DemoTable tbl1
    -> where Score IN( select min(Score) from DemoTable tbl2 where tbl1.Name=tbl2.Name);

実行結果:

+-------+-------+
| Name  | Score |
+-------+-------+
| John  |    45 |
| Chris |    38 |
+-------+-------+
2 rows in set (0.00 sec)

クエリの仕組み

このクエリでは、外部クエリ(tbl1)の各行に対して、同じNameを持つレコード群(tbl2)の中から最小のScoreを算出し、その値が現在の行のScoreと一致するかどうかを判定しています。その結果、Johnの最小値「45」とChrisの最小値「38」というように、グループごとの最小値だけが抽出される仕組みです。

なお、MySQL 8.0以降ではROW_NUMBER()などのウィンドウ関数を使う方法もありますが、今回のような相関サブクエリ方式は古いバージョンでも動作し、シンプルに記述できるため互換性の高い手法として広く使われています。

  1. 【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

  2. MySQLで1つのINSERT文を使って列に複数の値を一括挿入する方法

    はじめにMySQLでは、1つのINSERT文を繰り返し実行しなくても、単一のクエリだけで同じ列に複数の値を挿入できます。VALUES句の後ろに、挿入したい値をカンマ区切りのタプル(行)として列挙するだけです。この方法はデータベースへの接続回数を減らせるため、大量のデータを登録する際にパフォーマンス面でも大きなメリットがあります。基本構文複数の値を1つの列に挿入する場合の基本構文は以下のとおりです。INSERT INTO テーブル名 VALUES(値1),(値2),...,(値N);このように、各値を丸括弧で囲み、カンマ(,)で区切って並べることで、1回のクエリで複数行をまとめて挿入できます。実