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

MySQLで特定の1行とランダムな他の行を同時に選択するクエリの書き方

MySQLでは、ORDER BY 句と RAND() 関数を組み合わせることで、「特定の1行」を必ず先頭に表示しつつ、それ以外の行をランダムに選択することができます。この記事では、実際のサンプルを使ってその手順をわかりやすく解説します。

サンプルテーブルの作成

まず、動作確認用のサンプルテーブルを作成しましょう。

mysql> create table oneSpecificRowAndOtherRandom
    -> (
    -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> Name varchar(20)
    -> );
Query OK, 0 rows affected (0.72 sec)

レコードの挿入

次に、INSERT文を使ってテーブルにデータを登録します。

mysql> insert into oneSpecificRowAndOtherRandom(Name) values('Larry');
Query OK, 1 row affected (0.56 sec)

mysql> insert into oneSpecificRowAndOtherRandom(Name) values('Sam');
Query OK, 1 row affected (0.13 sec)

mysql> insert into oneSpecificRowAndOtherRandom(Name) values('Mike');
Query OK, 1 row affected (0.12 sec)

mysql> insert into oneSpecificRowAndOtherRandom(Name) values('Carol');
Query OK, 1 row affected (0.15 sec)

mysql> insert into oneSpecificRowAndOtherRandom(Name) values('Chris');
Query OK, 1 row affected (0.21 sec)

mysql> insert into oneSpecificRowAndOtherRandom(Name) values('Bob');
Query OK, 1 row affected (0.13 sec)

mysql> insert into oneSpecificRowAndOtherRandom(Name) values('David');
Query OK, 1 row affected (0.13 sec)

登録済みレコードの確認

SELECT文でテーブルの中身を確認してみましょう。

mysql> select * from oneSpecificRowAndOtherRandom;

実行すると、以下のような結果が表示されます。

+----+-------+
| Id | Name  |
+----+-------+
| 1  | Larry |
| 2  | Sam   |
| 3  | Mike  |
| 4  | Carol |
| 5  | Chris |
| 6  | Bob   |
| 7  | David |
+----+-------+
7 rows in set (0.00 sec)

特定の行を優先してランダムに行を選択するクエリ

ここからが本題です。次のクエリでは、Id = 5 の行(Chris)を必ず先頭に固定しながら、残りの行からランダムに2件を追加で取得しています。

mysql> select * from oneSpecificRowAndOtherRandom ORDER BY (Id = 5) DESC, RAND() LIMIT 0,3;

実行結果は以下の通りです。Id = 5 の「Chris」が常に最初に表示され、その後にランダムな行が続いているのがわかります。

+----+-------+
| Id | Name  |
+----+-------+
| 5  | Chris |
| 1  | Larry |
| 2  | Sam   |
+----+-------+
3 rows in set (0.05 sec)

もう一度実行してランダム性を確認

RAND() を使っているため、同じクエリを再度実行すると、2番目以降の行は毎回異なる結果になります。

mysql> select * from oneSpecificRowAndOtherRandom ORDER BY (Id = 5) DESC, RAND() LIMIT 0,3;
+----+-------+
| Id | Name  |
+----+-------+
| 5  | Chris |
| 2  | Sam   |
| 4  | Carol |
+----+-------+
3 rows in set (0.00 sec)

仕組みのポイント

  • (Id = 5) は条件が真の場合に 1、偽の場合に 0 を返します。
  • これを DESC(降順) で並べ替えることで、該当する行が必ず最前面に来ます。
  • その後の RAND() によって、残りの行がランダムな順序で並べ替えられます。
  • LIMIT 0,3 により、上位3件のみを取得しています。

この手法は、おすすめ商品を固定で表示しつつ関連アイテムをランダムに出したい場合など、実務でも応用範囲の広いテクニックです。

  1. MySQLで最大・最小の給与行を選択するクエリの書き方

    MySQLで最大・最小の給与行を取得する方法テーブルから給与が最も高い行と最も低い行を同時に取得したい場合は、サブクエリとMIN()関数・MAX()関数を組み合わせます。さらに、最大値と最小値の両方を一度に扱うためにUNION ALLを使用します。ここでは、テーブル作成から結果確認までの手順をサンプルコードとともに解説します。1. サンプルテーブルの作成まず、従業員名と給与を格納するテーブルを作成しましょう。mysql> create table DemoTable    -> (    -> E

  2. MySQLで特定の行と列に値を挿入(更新)する方法

    MySQLで特定の行と列に値を挿入する方法 MySQLでは、すでに存在するレコードの特定の行と列に値を設定(挿入)する場合、UPDATE文を使用します。ここでは、テーブルの作成からデータの挿入、特定のセルの値の更新、結果の確認までの手順を順番に解説します。 1. テーブルを作成する まず、サンプル用のテーブルを作成しましょう。 mysql> create table DemoTable1569 -> ( -> StudentId varchar(10), -> StudentName varchar(20) -> ); Query