【MySQL】特定の列の値を先頭に固定し、残りの行をランダム順で表示する方法
MySQLで行をランダムに並べ替えるには RAND() 関数を使用しますが、さらに「特定の列の値だけは必ず先頭に固定して表示したい」という場合には、ORDER BY 句と組み合わせることで実現できます。
この記事では、特定の値を持つ行を常に最上位に固定しつつ、それ以外の行をランダムな順序で表示する方法を、実際のSQL例とともに解説します。
1. サンプルテーブルを作成する
まず、数値を格納するシンプルなテーブルを作成します。
mysql> create table DemoTable1921
(
Number int
);
Query OK, 0 rows affected (0.00 sec)
2. レコードを挿入する
INSERT コマンドを使って、テーブルにいくつかのレコードを追加します。
mysql> insert into DemoTable1921 values(40);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1921 values(80);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1921 values(820);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1921 values(10);
Query OK, 1 row affected (0.00 sec)
3. テーブルの内容を確認する
SELECT 文ですべてのレコードを表示してみましょう。
mysql> select * from DemoTable1921;
実行結果は以下の通りです。
+--------+
| Number |
+--------+
| 40 |
| 80 |
| 820 |
| 10 |
+--------+
4 rows in set (0.00 sec)
4. 特定の値を固定し、残りの行をランダムに表示する
ここが本題です。「Number = 40」の行を必ず先頭に固定し、それ以外の行はランダムな順序で表示するには、次のようなクエリを実行します。
mysql> select * from DemoTable1921
order by (Number=40) desc, rand();
実行結果の例:
+--------+
| Number |
+--------+
| 40 |
| 820 |
| 10 |
| 80 |
+--------+
4 rows in set (0.00 sec)
仕組みの解説
このクエリのポイントは、ORDER BY (Number=40) DESC の部分です。MySQLでは、条件式 (Number=40) は真の場合に 1、偽の場合に 0 を返します。DESC(降順)を指定することで、条件が真(=1)となる「40」の行が常に最初に並びます。
その後ろにある rand() は第2ソートキーとして機能し、条件に一致しなかった残りの行を毎回異なるランダムな順序で並べ替えます。そのため、何度実行しても「40」は常に先頭に表示され、その他の行の並び順は実行するたびに変化します。
同様のテクニックは、ピン留めされた記事を目立たせたい一覧ページや、優先度の高いデータを常に上位に表示したいケースなど、実務でも幅広く応用できます。
-
MySQLでNULL値を特定の値に置き換える方法:IFNULL()関数の使い方
MySQLでは、IFNULL()関数を使用することで、列に含まれるNULL値を検出し、任意の特定の値に置き換えて表示することができます。この記事では、サンプルテーブルの作成からIFNULL()を使ったクエリの実行まで、具体的な手順をわかりやすく解説します。 サンプルテーブルの作成 まず、以下のコマンドでテーブルを作成しましょう。ここでは、名前を格納する「FirstName」列を持つテーブルを定義します。 mysql> create table DemoTable1878 ( FirstName varchar(20) ); Query OK, 0 rows af
-
MySQLで最初の3件のレコードに特定の値を設定する方法
MySQLで、テーブルの最初の3件のレコードだけに特定の値を設定したい場合は、UPDATE文と組み合わせて LIMIT 3 を使用します。MySQLのUPDATE文は ORDER BY 句と LIMIT 句をサポートしているため、更新対象の行数を簡単に制御できます。ここでは、実際の手順をサンプルコードとともに解説します。 サンプルテーブルの作成 まず、テーブルを作成しましょう。 mysql> create table DemoTable1968 ( Id int NOT NULL AUTO_I