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

MySQLのORDER BY句でRAND()関数を使って行の並び順をシャッフルする方法

MySQLでは、ORDER BY句にRAND()関数を組み合わせて使用することで、結果セットの行をランダムな順序(シャッフルされた状態)で取得できます。クエリを実行するたびに並び順が変わるため、抽選やランダム表示などに活用できる便利な手法です。

サンプルテーブルの準備

この仕組みを理解するために、以下のようなレコードを持つ「employee」テーブルを例に見ていきましょう。

mysql> Select * from employee;
+----+--------+--------+
| ID | Name   | Salary |
+----+--------+--------+
| 1  | Gaurav | 50000  |
| 2  | Rahul  | 20000  |
| 3  | Advik  | 25000  |
| 4  | Aarav  | 65000  |
| 5  | Ram    | 20000  |
| 6  | Mohan  | 30000  |
| 7  | Aryan  | NULL   |
| 8  | Vinay  | NULL   |
+----+--------+--------+
8 rows in set (0.00 sec)

ORDER BY RAND()で行をシャッフルする

次のクエリのように、ORDER BY句の後ろにRAND()を指定すると、結果セットの行がランダムな順序で返されます。

mysql> Select * from Employee ORDER BY RAND();
+----+--------+--------+
| ID | Name   | Salary |
+----+--------+--------+
| 4  | Aarav  | 65000  |
| 1  | Gaurav | 50000  |
| 3  | Advik  | 25000  |
| 7  | Aryan  | NULL   |
| 6  | Mohan  | 30000  |
| 8  | Vinay  | NULL   |
| 5  | Ram    | 20000  |
| 2  | Rahul  | 20000  |
+----+--------+--------+
8 rows in set (0.00 sec)

ご覧のとおり、元のテーブルではID順に並んでいたデータが、実行結果ではバラバラの順序になっています。同じクエリを実行するたびに、毎回異なる並び順になります。

注意点:パフォーマンスについて

ORDER BY RAND()は非常にシンプルで便利ですが、大量の行を扱うテーブルではパフォーマンスが低下しやすいという点に注意が必要です。RAND()はすべての行に対して評価を行うため、行数が多いほど処理コストが増大します。小規模なテーブルでのランダム取得には最適ですが、数万件を超えるような大きなテーブルでは、別の手法(ランダムなIDを事前に生成して検索する方法など)を検討するとよいでしょう。

  1. MySQLでIN句に指定した順序どおりに行を取得する方法:FIND_IN_SET()の活用

    IN句の順序で行を取得するには?MySQLでは、IN句に指定した値の順序どおりに結果セットを取得したい場合、通常のクエリでは実現できません。そこで活躍するのが FIND_IN_SET() 関数です。この関数を ORDER BY 句と組み合わせることで、IN句で指定した値の並び順そのままに行をソートできます。基本構文SELECT yourVariableName.* FROM yourTableName yourVariableName WHERE yourVariableName.yourColumnName IN(value1,value2,...N) ORDER BY FIND_IN_SE

  2. MySQLのGROUP BY句で各グループから1行だけを選択・抽出する方法

    MySQLでは、GROUP BY句とサブクエリを組み合わせることで、各グループから特定の1行(たとえば最小のIDを持つ行)を取り出すことができます。本記事では、学生の点数データを例に、テーブル作成から実際のクエリ実行までの手順をわかりやすく解説します。 1. テーブルの作成 まず、以下のCREATE TABLE文でサンプル用のテーブルを作成します。 mysql> create table DemoTable1572     -> (     -> StudentId int,  &nb