MySQL 複数カラム’order by’の並び替え
- 2019年8月01日
- Windows, Web Service
Webシステムで頻繁に使用されるパターンで、登録をおこなった後に一覧画面に表示するといった処理があります。
一覧画面では、登録が新しい順に並べたいと思います。初回登録時の日時は「created」カラムに保存されます。
また一覧画面では編集をおこなうことも可能で、編集をおこなった場合の編集日時は「modified」カラムに保存されます。
まずはシンプルなパターン、「created」カラムに登録されている日付の新しい順に並べるSQLです。
select
created
, modified
from
products
order by
created desc;
上記の実行結果:

次は「modified」カラムに登録されている日付の新しい順に並べるSQLです。
select
created
, modified
from
products
order by
modified desc;
上記の実行結果:

以上2つのSQLをミックスしてみたいと思います。
select
created
, modified
from
products
order by
modified desc, created desc;
上記の実行結果:

この実行結果ではmodifiedカラムに登録されている日付が新しい順に並び、その後(modifiedカラムがnullの場合は)
createdカラムに登録されている日付が新しい順に並ぶという結果になりました。
modified(編集)はcreated(新規登録)より古くなることはないので、modifiedがnullの場合のみ、createdの日時を並び替えの対象として設定したいと思います。
カラムがnullかどうかの判定方法は使用しているRDBMSにより異なるようで、
例えば以下のような記述方法となります。
■MySQL/MariaDBの場合
IFNULL(expr1,expr2)
■SQLServerの場合
ISNULL(expr1,expr2)
今回はMySQL/MariaDBを使用していますので、以下のようにSQLを作成しました。
orderdtという仮想のカラムを作成して、modifiedがnullの場合は、
createdがorderdtに格納され、modifiedがnullではない場合は、
modifiedがorderdtに格納されるようにしてます。
並び順はorderdtを基準に新しい順に並びかえたいと思います。
select
created
, modified
, ifnull(modified, created) as orderdt
from
products
order by
orderdt desc;
上記の実行結果:

これで想定通りの並び順になりました。
木曜日担当:nishida
nishida at 2019年08月01日 10:00:07