MySQLのORDER BY CASEを使って現在日を基準に月日順にレコードを並べ替える方法
MySQLで日付データを「今日以降の日付が先、過去の日付が後」というルールで並べ替えたい場合、ORDER BY句とCASE式を組み合わせることで簡単に実現できます。本記事では、実際のSQL例を交えながらその手順をわかりやすく解説します。
サンプルテーブルの作成
まずは練習用のテーブルを作成しましょう。ここでは日付型のカラムを1つだけ持つシンプルなテーブルを用意します。
mysql> create table DemoTable ( DueDate date ); Query OK, 0 rows affected (0.56 sec)
注意: この記事では、現在の日付が 2019-07-22 であることを前提に説明を進めます。
テストデータの挿入
次に、INSERT文を使っていくつかのレコードを追加していきます。
mysql> insert into DemoTable values('2019-03-10');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values('2019-08-25');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('2019-06-01');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values('2019-12-31');
Query OK, 1 row affected (0.17 sec)
登録済みレコードの確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from DemoTable;
上記のクエリを実行すると、以下のような結果が得られます。
+------------+ | DueDate | +------------+ | 2019-03-10 | | 2019-08-25 | | 2019-06-01 | | 2019-12-31 | +------------+ 4 rows in set (0.00 sec)
現在日を基準に月日順で並べ替えるクエリ
ここからが本題です。以下のクエリでは、CASE式を使って「未来の日付には0、過去の日付には1」という値を割り当て、その後にDueDateで昇順ソートを行っています。
mysql> select *from DemoTable order by case when DueDate > curdate() then 0 else 1 end, DueDate;
実行結果は以下の通りです。
+------------+ | DueDate | +------------+ | 2019-08-25 | | 2019-12-31 | | 2019-03-10 | | 2019-06-01 | +------------+ 4 rows in set (0.00 sec)
クエリの仕組みを解説
このクエリのポイントは、ORDER BY句の中でCASE式を使用している点です。CURDATE()関数は現在の日付を返すため、「DueDate > CURDATE()」という条件で未来の日付かどうかを判定できます。
- 未来の日付(2019-08-25、2019-12-31)はCASE式の評価結果が0となり、先頭に並びます。
- 過去の日付(2019-03-10、2019-06-01)は評価結果が1となり、後半にまとめられます。
- 同じグループ内では、第2ソートキーであるDueDate(昇順)によって日付順に整列されます。
たとえばタスク管理システムで「期限がまだ来ていない項目を優先的に表示し、期限切れの項目は下部にまとめる」ようなケースにおいて、このテクニックは非常に役立ちます。ぜひ実際の開発でも活用してみてください。
-
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の行が配置され
-
MySQLで現在の日付の月・日と比較してレコードを取得する方法
はじめにMySQLで、現在の日付の「月」と「日」が一致するレコードだけを抽出したいケースはよくあります。例えば、記念日や誕生日のように年に関係なく同じ日付のデータを取得したい場合に便利です。このような場合には、MONTH()関数とDAY()関数を組み合わせて使用します。ここでは、実際にテーブルを作成し、データを挿入して、現在の日付と月日を比較してレコードを取得する手順を解説します。サンプルテーブルの作成まず、記念日を格納するテーブルを作成します。mysql> create table DemoTable1429 -> ( &n