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

負の値を降順に、正の値を昇順に並べて表示するMySQLクエリ

このような並び順を実現するには、UNIONを使用します。まずはサンプルテーブルを作成しましょう。

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

テストデータの挿入

INSERTコマンドを使って、いくつかのレコードをテーブルに登録します。

mysql> insert into DemoTable values(10);
Query OK, 1 row affected (0.23 sec)

mysql> insert into DemoTable values(100);
Query OK, 1 row affected (0.14 sec)

mysql> insert into DemoTable values(-9);
Query OK, 1 row affected (0.21 sec)

mysql> insert into DemoTable values(-190);
Query OK, 1 row affected (0.14 sec)

mysql> insert into DemoTable values(190);
Query OK, 1 row affected (0.22 sec)

mysql> insert into DemoTable values(0);
Query OK, 1 row affected (0.11 sec)

mysql> insert into DemoTable values(140);
Query OK, 1 row affected (0.16 sec)

登録済みデータの確認

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

mysql> select *from DemoTable;

出力結果

+--------+
| Number |
+--------+
| 10     |
| 100    |
| -9     |
| -190   |
| 190    |
| 0      |
| 140    |
+--------+
7 rows in set (0.00 sec)

負の値を降順、正の値を昇順で表示するクエリ

以下が、負の値を降順で、その後に正の値を昇順で表示するクエリです。最初に0を表示するようにしています。

mysql> (select *from DemoTable where Number=0)
-> union
-> (select *from DemoTable where Number < 0 order by Number desc)
-> union
-> (select *from DemoTable where Number > 0 order by Number);

出力結果

このクエリを実行すると、次のような出力が得られます。

+--------+
| Number |
+--------+
| 0      |
| -9     |
| -190   |
| 10     |
| 100    |
| 190    |
| 140    |
+--------+
7 rows in set (0.03 sec)

仕組みの解説

上記のクエリでは、3つのSELECT文をUNIONで結合しています。

1つ目のSELECT: Number = 0 のレコードを取得し、先頭に配置します。
2つ目のSELECT: Number < 0 のレコード(負の値)を ORDER BY Number DESC で降順にソートして取得します。これにより、絶対値の小さい負の値(-9など)から順に表示されます。
3つ目のSELECT: Number > 0 のレコード(正の値)を ORDER BY Number で昇順にソートして取得します。

なお、UNIONで結合した場合、各SELECT文内のORDER BY句は通常無視されることがあります。確実に意図した順序でソートしたい場合は、LIMIT句を併用するか、CASE式を使った単一のSELECT文で実現する方法も検討するとよいでしょう。

  1. MySQLで過去3か月以内のレコードを優先表示し、アルファベット順に並べ替える方法

    概要MySQLでは、ORDER BY句に条件式を組み合わせることで、「現在日から過去3か月以内」のレコードを優先的に表示しつつ、全レコードを名前のアルファベット順に並べ替えることができます。本記事では、具体的なサンプルを使ってその手順をわかりやすく解説します。サンプルテーブルの作成まず、顧客名と購入日を格納するテーブルを作成します。mysql> create table DemoTable1526 -> ( -> CustomerName varchar(20), -> PurchaseDate date -> );Query OK, 0

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

    MySQLでは、ORDER BY句に条件式を組み合わせることで、昇順(ASC)と降順(DESC)の並び替えを1つのクエリで実現できます。このテクニックを使うと、特定の値を起点として「ラップアラウンド(折り返し)」したような並び順を作成できます。この記事では、実際のサンプルを使ってその方法を解説します。1. サンプルテーブルの作成まず、テーブルを作成します。mysql> create table DemoTable    -> (    -> Value int   &