MySQLの日付計算でORDER BY句を活用する方法
はじめに
日付の計算を行う際にORDER BY句を組み合わせると、目的のレコードをより簡単かつ効率的に検索できるようになります。本記事では、サンプルテーブル「Collegedetail」を使いながら、日付の計算結果を並べ替える方法を具体的に解説します。
サンプルデータの確認
まず、以下の「Collegedetail」テーブルのデータを見てみましょう。このテーブルには、大学のID、所在国、設立日が格納されています。
mysql> Select * from Collegedetail; +------+---------+------------+ | ID | Country | Estb | +------+---------+------------+ | 111 | INDIA | 2010-05-01 | | 130 | INDIA | 1995-10-25 | | 139 | USA | 1994-09-25 | | 1539 | UK | 2001-07-23 | | 1545 | Russia | 2010-07-30 | +------+---------+------------+ 5 rows in set (0.00 sec)
大学の創立年数を計算する
次に、各大学が設立されてから何年経過しているかを計算してみます。CURDATE()関数で現在の日付を取得し、YEAR()関数とRIGHT()関数を組み合わせることで、正確な経過年数を求めることができます。
mysql> Select ID, estb, CURDATE(),((YEAR(CURDATE())-YEAR(estb))-(RIGHT(CURDATE(),5)<RIGHT(estb,5))) AS 'YEARS_OLD' from collegedetail; +------+------------+------------+-----------+ | ID | estb | CURDATE() | YEARS_OLD | +------+------------+------------+-----------+ | 111 | 2010-05-01 | 2017-11-30 | 7 | | 130 | 1995-10-25 | 2017-11-30 | 22 | | 139 | 1994-09-25 | 2017-11-30 | 23 | | 1539 | 2001-07-23 | 2017-11-30 | 16 | | 1545 | 2010-07-30 | 2017-11-30 | 7 | +------+------------+------------+-----------+ 5 rows in set (0.00 sec)
このクエリでは、現在の年から設立年を引き、さらに月日を比較して誕生日がまだ来ていない場合は1を減算することで、厳密な年齢を算出しています。
ORDER BY句で創立年数順に並べ替える
上記のクエリにORDER BY句を追加すると、計算した創立年数(YEARS_OLD)の昇順にレコードを並べ替えられます。これにより、歴史の浅い大学から順に一覧できます。
mysql> Select ID, estb, CURDATE(),((YEAR(CURDATE())-YEAR(estb))-(RIGHT(CURDATE(),5)<RIGHT(estb,5))) AS 'YEARS_OLD' from collegedetail ORDER BY YEARS_OLD; +------+------------+------------+-----------+ | ID | estb | CURDATE() | YEARS_OLD | +------+------------+------------+-----------+ | 111 | 2010-05-01 | 2017-11-30 | 7 | | 1545 | 2010-07-30 | 2017-11-30 | 7 | | 1539 | 2001-07-23 | 2017-11-30 | 16 | | 130 | 1995-10-25 | 2017-11-30 | 22 | | 139 | 1994-09-25 | 2017-11-30 | 23 | +------+------------+------------+-----------+ 5 rows in set (0.01 sec)
結果セットを見ると、ORDER BY句を使うことで、最も古い大学や新しい大学を簡単に特定できることがわかります。
DESCキーワードで降順にソートする
さらに、ORDER BY句にDESCキーワードを組み合わせれば、最も古い大学が先頭行に表示されるように降順で並べ替えることも可能です。
mysql> Select ID, estb, CURDATE(),((YEAR(CURDATE())-YEAR(estb))-(RIGHT(CURDATE(),5)<RIGHT(estb,5))) AS 'YEARS_OLD' from collegedetail ORDER BY YEARS_OLD DESC; +------+------------+------------+-----------+ | ID | estb | CURDATE() | YEARS_OLD | +------+------------+------------+-----------+ | 139 | 1994-09-25 | 2017-11-30 | 23 | | 130 | 1995-10-25 | 2017-11-30 | 22 | | 1539 | 2001-07-23 | 2017-11-30 | 16 | | 111 | 2010-05-01 | 2017-11-30 | 7 | | 1545 | 2010-07-30 | 2017-11-30 | 7 | +------+------------+------------+-----------+ 5 rows in set (0.00 sec)
まとめ
このように、日付計算の結果に対してORDER BY句を使用すると、データの検索性が大幅に向上します。昇順(ASC)では新しい順、降順(DESC)では古い順に表示できるため、「最も歴史のある大学を探したい」といったケースでも瞬時に目的のレコードを取得できます。エイリアス名(YEARS_OLD)をそのままORDER BY句に指定できる点も、実務で覚えておくと便利なテクニックです。
-
MySQLでUNIONとORDER BY句を組み合わせて使う方法
UNIONはMySQLにおける演算子の一種で、ORDER BY句と組み合わせることで、結合後のレコードを自由に並べ替えることができます。複数のテーブルから行を順番に取得したい場合や、1つのテーブルから複数の行セットを取り出し、それらを1つの結果セットとして扱いたい場合にUNIONを使用します。ここでは、実際の例を使ってUNIONとORDER BYの使い方を解説します。最初のテーブルを作成するまず、サンプル用のテーブル「UnionDemo1」を作成します。 mysql> create table UnionDemo1 -> ( -> id int ->
-
MySQLでIN句に指定した順序どおりに行を取得する方法:FIND_IN_SET()の活用
IN句の順序で行を取得するには?MySQLでは、IN句に指定した値の順序どおりに結果セットを取得したい場合、通常のクエリでは実現できません。そこで活躍するのが FIND_IN_SET() 関数です。この関数を ORDER BY 句と組み合わせることで、IN句で指定した値の並び順そのままに行をソートできます。基本構文SELECT yourVariableName.* FROM yourTableName yourVariableName WHERE yourVariableName.yourColumnName IN(value1,value2,...N) ORDER BY FIND_IN_SE