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()などのウィンドウ関数を利用する方法が推奨されます。
-
MySQLで現在の日付に登録したユーザー数を取得する方法
はじめに MySQLで「現在の日付に登録されたユーザーの数」を取得したい場合は、COUNT()関数とGROUP BY MONTH()を組み合わせます。現在の日付との比較には、CURRENT_DATE()(またはCURDATE())を使用します。 現在の日付を確認する まず、現在の日付を確認しておきましょう。CURDATE()関数を使うと、今日の日付を簡単に取得できます。 mysql> select curdate() ; +------------+ | curdate() | +------------+ | 2019-11-30 | +------------+ 1 row in
-
MySQLで特定の日付のレコード数をカウントする方法
MySQLでは、COUNT(*)関数とWHERE句を組み合わせることで、特定の日付に該当するレコードの件数を簡単に取得できます。この記事では、サンプルテーブルを作成し、指定した日付のデータ件数をカウントする手順を順番に解説します。 1. サンプルテーブルの作成 まず、日付型(DATE)のカラムを持つテーブルを作成しましょう。 mysql> create table DemoTable1946 ( ShippingDate date ); Quer