MySQL 複数カラム’order by’の並び替え

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



アプリ関連ニュース

お問い合わせはこちら

お問い合わせ・ご相談はお電話、またはお問い合わせフォームよりお受け付けいたしております。

tel. 06-6454-8833(平日 10:00~17:00)

お問い合わせフォーム