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

MySQLで値が重複している場合に特定の行を取得する方法

値が同じ(重複している)場合に特定の行だけを取得したいときは、GROUP BYを使うのが便利です。ここでは、サブクエリで並べ替えを行った結果をグループ化することで、目的の行を取り出す手順を具体的に解説します。

1. テーブルを作成する

まず、以下のコマンドでサンプル用のテーブルを作成します。

mysql> create table DemoTable659(Id int, Name varchar(100), Score int);
Query OK, 0 rows affected (0.52 sec)

2. レコードを挿入する

insertコマンドを使って、いくつかのレコードを追加していきます。

mysql> insert into DemoTable659 values(11,'John',45);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable659 values(15,'John',59);
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable659 values(15,'Sam',61);
Query OK, 1 row affected (0.14 sec)

3. テーブルの内容を確認する

select文ですべてのレコードを表示してみましょう。

mysql> select * from DemoTable659;

実行結果は次のとおりです。

+------+------+-------+
| Id   | Name | Score |
+------+------+-------+
|   11 | John |    45 |
|   15 | John |    59 |
|   15 | Sam  |    61 |
+------+------+-------+
3 rows in set (0.00 sec)

このように、「John」という名前が2行に重複して登録されています。ここから、名前ごとに1行だけを取得することを目標にします。

4. 重複する値の中から特定の行を取得するクエリ

値が同じ場合に特定の行をフェッチするには、次のようなクエリを実行します。

mysql> select * from ( select * from DemoTable659 order by Id desc) tbl group by Name;

ポイントは、サブクエリ内でorder by Id descによってIdの降順に並べ替えを行い、その結果に対して外側のクエリでgroup by Nameを適用している点です。これにより、Nameごとに1行ずつが結果として返されます。

実行結果は次のとおりです。

+------+------+-------+
| Id   | Name | Score |
+------+------+-------+
|   11 | John | 45    |
|   15 | Sam  | 61    |
+------+------+-------+
2 rows in set (0.04 sec)

重複していた「John」の行が1つにまとまり、全体の行数が3行から2行になっていることが確認できます。

補足:より確実な方法について

上記の書き方はMySQLの内部動作に依存する部分があるため、実行環境やバージョンによってどの行が選ばれるかが変わる可能性があります。「Idが最大の行」のように取得する行を明確に指定したい場合は、MAX()などの集計関数を使うか、MySQL 8.0以降であればROW_NUMBER()などのウィンドウ関数を利用する方法が推奨されます。

  1. MySQLで現在の日付に登録したユーザー数を取得する方法

    はじめに MySQLで「現在の日付に登録されたユーザーの数」を取得したい場合は、COUNT()関数とGROUP BY MONTH()を組み合わせます。現在の日付との比較には、CURRENT_DATE()(またはCURDATE())を使用します。 現在の日付を確認する まず、現在の日付を確認しておきましょう。CURDATE()関数を使うと、今日の日付を簡単に取得できます。 mysql> select curdate() ; +------------+ | curdate() | +------------+ | 2019-11-30 | +------------+ 1 row in

  2. MySQLで特定の日付のレコード数をカウントする方法

    MySQLでは、COUNT(*)関数とWHERE句を組み合わせることで、特定の日付に該当するレコードの件数を簡単に取得できます。この記事では、サンプルテーブルを作成し、指定した日付のデータ件数をカウントする手順を順番に解説します。 1. サンプルテーブルの作成 まず、日付型(DATE)のカラムを持つテーブルを作成しましょう。 mysql> create table DemoTable1946     (     ShippingDate date     ); Quer