SQLのorder byで複数カラム指定する方法についてまとめています。
order byで複数条件を指定するにはカラムを列挙する
以下のSQLは、employees(社員)テーブルの全カラムを、emp_no(社員番号)降順、first_name(名)昇順、hire_date(雇用日)昇順で10件取得するSQLです。
SELECT * FROM `employees` ORDER BY emp_no DESC, first_name, hire_date ASC limit 10; +--------+------------+------------+--------------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+--------------+--------+------------+ | 500000 | 1970-01-04 | TARO | Yamada | M | 2001-04-07 | | 499999 | 1958-05-01 | Sachin | Tsukuda | M | 1997-11-30 | | 499998 | 1956-09-05 | Patricia | Breugel | M | 1993-10-13 | | 499997 | 1961-08-03 | Berhard | Lenart | M | 1986-04-21 | | 499996 | 1953-03-07 | Zito | Baaz | M | 1990-09-27 | | 499995 | 1958-09-24 | Dekang | Lichtner | F | 1993-01-12 | | 499994 | 1952-02-26 | Navin | Argence | F | 1990-04-24 | | 499993 | 1963-06-04 | DeForest | Mullainathan | M | 1997-04-07 | | 499992 | 1960-10-12 | Siamak | Salverda | F | 1987-05-10 | | 499991 | 1962-02-26 | Pohua | Sichman | F | 1989-01-12 | +--------+------------+------------+--------------+--------+------------+ 10 rows in set (0.17 sec)
order byの後ろにソートしたいカラムを並べて記述すれば良いんですね。カラム毎に昇順(ASC)と降順(DESC)をそれぞれ指定できます。
【関連記事】
▶SQL order byでソート指定するサンプルコード集 指定のレコードだけ先頭に並べるには?
複数のselect文でorder byを指定するサンプルコード
複雑な条件で抽出したレコードをorder byでソートするには、サブクエリ内でunion allして統合してからorder byでソート指定します。
以下のSQLは、誕生日が1970年1月1日以降の女性と誕生日が1960年1月1日以前の男性のレコードを取得し、姓名の姓(last_name)と、社員番号(emp_no)でソートする例です。
select * from (select emp_no, first_name, last_name, hire_date from employees where birth_date > 1970-01-01 and gender = 'F' union all select emp_no, first_name, last_name, hire_date from employees where birth_date < 1960-01-01 and gender = 'M' ) t1 order by last_name, emp_no limit 100; +--------+------------+-----------+------------+ | emp_no | first_name | last_name | hire_date | +--------+------------+-----------+------------+ | 12516 | Sreenivas | Aamodt | 1990-03-06 | | 12982 | Sachem | Aamodt | 1992-01-11 | | 17400 | Basim | Aamodt | 1991-09-15 | | 18182 | Dekang | Aamodt | 1988-05-25 | | 27188 | Vasilii | Aamodt | 1996-10-12 | | 27413 | Phuoc | Aamodt | 1987-08-28 | | 28387 | Nahla | Aamodt | 1997-02-15 | | 29182 | Arumugam | Aamodt | 1986-01-09 | | 31701 | Carrsten | Aamodt | 1985-10-07 | | 35101 | Christ | Aamodt | 1990-02-05 | | 36585 | Menkae | Aamodt | 1986-02-07 | | 40184 | Zvonko | Aamodt | 1991-04-29 | | 42199 | Mats | Aamodt | 1989-10-03 | | 42706 | Khalid | Aamodt | 1993-07-31 | | 46884 | Marla | Aamodt | 1989-07-18 | | 50775 | Shai | Aamodt | 1991-10-25 | | 51897 | Rajmohan | Aamodt | 1986-05-22 | | 52791 | Khatoun | Aamodt | 1994-08-26 | | 55985 | Ung | Aamodt | 1990-07-15 | | 56183 | Takahiro | Aamodt | 1995-09-06 | : :
まとめ
- 複数の並べ替え条件を指定するには、order byの後に複数のカラムを記述する
- カラムごとにdesc、ascの並び順指定が可能
- 複数のselect文の結果をorder byするにはunian allとサブクエリを組み合わせる