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

MySQLで重複しない日付(個別の値)を表示する方法

MySQLでは、datetime型のカラムから「日付のみ」を基準に重複を排除してデータを取得したいケースがよくあります。例えば、同じ日に複数の注文や出荷記録がある場合、日付単位で1件だけ取り出したいときなどです。本記事では、GROUP BYDATE()関数を組み合わせて、重複しない日付ごとのレコードを表示する方法を解説します。

1. サンプルテーブルを作成する

まず、動作確認用のテーブルを作成しましょう。ここでは、出荷日時(ShippingDate)と顧客名(CustomerName)を持つテーブルを定義します。

mysql> create table DemoTable1996
(
    ShippingDate datetime,
    CustomerName varchar(20)
);
Query OK, 0 rows affected (0.84 sec)

2. テストデータを挿入する

次に、INSERT文を使ってサンプルレコードを登録します。ポイントは、同じ日付(2019-12-21)に複数のレコードが存在することです。

mysql> insert into DemoTable1996 values('2019-12-21 10:45:00','Chris');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable1996 values('2019-12-21 12:10:00','David');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable1996 values('2019-12-20 12:10:00','Bob');
Query OK, 1 row affected (0.14 sec)

3. 全レコードを確認する

SELECT文で全件を表示すると、以下のように3件のレコードが格納されていることがわかります。

mysql> select * from DemoTable1996;
+---------------------+--------------+
| ShippingDate        | CustomerName |
+---------------------+--------------+
| 2019-12-21 10:45:00 | Chris        |
| 2019-12-21 12:10:00 | David        |
| 2019-12-20 12:10:00 | Bob          |
+---------------------+--------------+
3 rows in set (0.00 sec)

このままでは「2019-12-21」の日付が2件重複しています。

4. 日付単位で重複を排除して表示する

datetime型から日付部分だけを抽出するには、DATE()関数を使用します。これをGROUP BY句と組み合わせることで、日付単位のグループごとに1行ずつ結果を取得できます。

mysql> select * from DemoTable1996 group by date(ShippingDate);
+---------------------+--------------+
| ShippingDate        | CustomerName |
+---------------------+--------------+
| 2019-12-21 10:45:00 | Chris        |
| 2019-12-20 12:10:00 | Bob          |
+---------------------+--------------+
2 rows in set (0.07 sec)

実行結果のポイント

上記の出力を見ると、元は3件あったレコードが2件になっています。「2019-12-21」に属していたChrisとDavidのレコードは同じ日付グループとみなされ、そのうちの1件(Chris)だけが表示されました。

  • DATE()関数: datetime型の値から時刻部分を切り捨て、「YYYY-MM-DD」形式の日付のみを返します。
  • GROUP BY句: 指定したカラム(ここではDATE(ShippingDate))の値が同じ行を1つのグループにまとめます。

注意点:ONLY_FULL_GROUP_BYモードについて

MySQL 5.7以降では、デフォルトでONLY_FULL_GROUP_BYモードが有効になっているため、SELECT句にGROUP BYで指定していないカラムを含めるとエラーになる場合があります。その場合は、以下のように集約関数を使うか、SQLモードの設定を見直してください。

mysql> select date(ShippingDate), min(CustomerName) as CustomerName
    -> from DemoTable1996
    -> group by date(ShippingDate);

このように書き換えることで、どの環境でも安全に日付単位の重複排除を実現できます。用途に応じてDISTINCTやウィンドウ関数(ROW_NUMBERなど)を活用するのも有効な選択肢です。

  1. MySQLで予約語「from」を列名として使用する方法

    MySQLで「from」を列名として使うには? MySQLでは「from」は予約語(リザーブドワード)として登録されているため、そのまま列名として使用するとエラーが発生します。しかし、バッククォート(`` ` ``)で囲むことで、予約語である「from」を列名として扱うことができます。 この記事では、実際にテーブルを作成し、「from」を列名としてデータの挿入や取得を行う手順を解説します。 1. バッククォートを使ってテーブルを作成する まず、列名「from」をバッククォートで囲んでテーブルを作成します。以下のSQLを実行してください。 mysql> create table Demo

  2. MySQLでテーブルを更新し、新しい列に名前のイニシャルを表示する方法

    MySQLでは、LEFT()関数とSUBSTRING_INDEX()関数を組み合わせることで、氏名からイニシャル(頭文字)だけを取り出すことができます。この記事では、実際にテーブルを作成し、既存のデータからイニシャルを生成して新しい列に格納する手順を解説します。 1. テーブルの作成 まず、氏名を保存する「full_name」列と、イニシャルを格納する「short_name」列を持つテーブルを作成しましょう。 mysql> create table demo13 -> ( -> full_name varchar(100), -> short_name varchar