負の値を降順に、正の値を昇順に並べて表示する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文で実現する方法も検討するとよいでしょう。
-
MySQLで過去3か月以内のレコードを優先表示し、アルファベット順に並べ替える方法
概要MySQLでは、ORDER BY句に条件式を組み合わせることで、「現在日から過去3か月以内」のレコードを優先的に表示しつつ、全レコードを名前のアルファベット順に並べ替えることができます。本記事では、具体的なサンプルを使ってその手順をわかりやすく解説します。サンプルテーブルの作成まず、顧客名と購入日を格納するテーブルを作成します。mysql> create table DemoTable1526 -> ( -> CustomerName varchar(20), -> PurchaseDate date -> );Query OK, 0
-
MySQLでORDER BY ASCとDESCを1つのクエリで実現し、指定した値からラップアラウンドする方法
MySQLでは、ORDER BY句に条件式を組み合わせることで、昇順(ASC)と降順(DESC)の並び替えを1つのクエリで実現できます。このテクニックを使うと、特定の値を起点として「ラップアラウンド(折り返し)」したような並び順を作成できます。この記事では、実際のサンプルを使ってその方法を解説します。1. サンプルテーブルの作成まず、テーブルを作成します。mysql> create table DemoTable -> ( -> Value int &