MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLでORDER BY ASCとDESCを1つのクエリで実現し、指定した値からラップアラウンドする方法

MySQLでは、ORDER BY句に条件式を組み合わせることで、昇順(ASC)と降順(DESC)の並び替えを1つのクエリで実現できます。このテクニックを使うと、特定の値を起点として「ラップアラウンド(折り返し)」したような並び順を作成できます。

この記事では、実際のサンプルを使ってその方法を解説します。

1. サンプルテーブルの作成

まず、テーブルを作成します。

mysql> create table DemoTable
    -> (
    -> Value int
    -> );
Query OK, 0 rows affected (3.21 sec)

2. レコードの挿入

次に、INSERTコマンドを使ってテーブルにレコードを挿入します。

mysql> insert into DemoTable values(20);
Query OK, 1 row affected (0.78 sec)
mysql> insert into DemoTable values(40);
Query OK, 1 row affected (0.94 sec)
mysql> insert into DemoTable values(30);
Query OK, 1 row affected (0.41 sec)
mysql> insert into DemoTable values(10);
Query OK, 1 row affected (0.26 sec)
mysql> insert into DemoTable values(90);
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable values(70);
Query OK, 1 row affected (0.49 sec)
mysql> insert into DemoTable values(80);
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable values(9);
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable values(8);
Query OK, 1 row affected (0.38 sec)

3. テーブルの内容を確認する

SELECT文ですべてのレコードを表示してみましょう。

mysql> select *from DemoTable;

以下のような出力が得られます。

+-------+
| Value |
+-------+
|    20 |
|    40 |
|    30 |
|    10 |
|    90 |
|    70 |
|    80 |
|     9 |
|     8 |
+-------+
9 rows in set (0.00 sec)

4. ラップアラウンドを実現するクエリ

ここが本題です。次のクエリは、「10より大きい値」を先頭グループとして昇順に並べ、残りの「10以下の値」を後ろで昇順に並べることで、最初の値へのラップアラウンドを実現します。

mysql> select *from DemoTable
    -> order by Value > 10 desc,Value asc;

仕組みの解説

このクエリのポイントは、条件式 Value > 10 をORDER BYの第1キーにしている点です。MySQLでは、条件式は真の場合に 1、偽の場合に 0 と評価されます。これを降順(DESC)で並べると、条件が真(1)となる行、つまり「10より大きい値」が先に来ます。その後、第2キーの Value asc によって、各グループ内で値が昇順にソートされます。

実行結果

+-------+
| Value |
+-------+
|    20 |
|    30 |
|    40 |
|    70 |
|    80 |
|    90 |
|     8 |
|     9 |
|    10 |
+-------+
9 rows in set (0.00 sec)

ご覧のとおり、20〜90の値が昇順で先頭に並び、その後に8、9、10と続いています。あたかも「10」を境界としてリストが折り返されたような並び順になっていますね。

まとめ

ORDER BY句の中でブール条件式を活用すれば、ASCとDESCを組み合わせた柔軟なソートが1つのクエリで実現できます。この手法は、特定の閾値を起点にデータを循環的に表示したい場合(例:カレンダーやスケジュールの週の開始曜日など)に特に便利です。

  1. 【MySQL】単一クエリでUNION SELECTとIN句を組み合わせる方法

    はじめにMySQLでは、UNION SELECTとIN句を単一のクエリ内で組み合わせることができます。これにより、複数のテーブルのデータを統合した上で、特定の条件に一致するレコードだけを効率的に抽出できます。本記事では、2つのテーブルを作成し、サブクエリとUNIONを活用して目的のデータを取得する手順を具体例とともに解説します。最初のテーブルを作成するまず、以下のコマンドでテーブル「DemoTable1」を作成します。mysql> create table DemoTable1 -> ( -> StudentId int, -> StudentN

  2. MySQLの単一クエリでSELECT LIKEとCHAR_LENGTH()を組み合わせて使う方法

    はじめにMySQLでは、LIKE句による部分一致検索と、CHAR_LENGTH()関数による文字数の条件指定を、1つのクエリ内で同時に組み合わせることができます。これにより、「特定の文字列を含み、かつ文字数が一定以下であるレコードだけを抽出する」といった柔軟なデータの絞り込みが可能になります。本記事では、実際にテーブルを作成し、データを挿入しながら、その具体的な手順を解説します。サンプルテーブルの作成まず、テーブルを作成します。mysql> create table DemoTable -> ( -> Name varchar(20) -> );Que