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

MySQLでランダム値のカラムを生成してレコードをランダムに並べ替える方法

MySQLでは、RAND()関数を利用してランダムな値を持つカラムを生成し、その値をもとにレコードをランダムに並べ替えることができます。この記事では、実際にテーブルを作成し、データを挿入したうえで、ランダム値による並べ替えを行う手順を具体的なSQL例とともに解説します。

1. サンプルテーブルの作成

まず、デモ用のテーブルを作成します。学生IDを主キーとして自動採番し、学生名を格納するシンプルな構造です。

mysql> create table DemoTable
(
    StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    StudentName varchar(20)
);
Query OK, 0 rows affected (0.57 sec)

2. テストデータの挿入

続いて、INSERT文を使ってテーブルに複数のレコードを挿入します。

mysql> insert into DemoTable(StudentName) values('Larry');
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable(StudentName) values('Sam');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable(StudentName) values('Mike');
Query OK, 1 row affected (0.34 sec)
mysql> insert into DemoTable(StudentName) values('Carol');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable(StudentName) values('Robert');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable(StudentName) values('Chris');
Query OK, 1 row affected (0.14 sec)

3. テーブルの内容を確認する

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

mysql> select *from DemoTable;

実行すると、以下のように登録された6件のレコードが表示されます。

+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
|         1 | Larry       |
|         2 | Sam         |
|         3 | Mike        |
|         4 | Carol       |
|         5 | Robert      |
|         6 | Chris       |
+-----------+-------------+
6 rows in set (0.00 sec)

4. ランダム値のカラムで並べ替える

ここからが本題です。サブクエリ内でRAND()+1を使って「randomRecord」というランダム値のカラムを新たに生成し、その値を基準に降順(DESC)で並べ替えています。RAND()は0以上1未満の乱数を返すため、1を加算することで1以上2未満の値となり、結果を見やすくしています。

mysql> SELECT *
FROM (SELECT StudentName, RAND()+1 AS randomRecord
FROM DemoTable
) tbl
ORDER BY RandomRecord DESC;

実行すると、以下のように毎回異なる順序でレコードが出力されます。

+-------------+--------------------+
| StudentName | RandomRecord       |
+-------------+--------------------+
| Carol       | 1.8973721451101566 |
| Chris       | 1.7821308670399065 |
| Mike        | 1.4640037673190271 |
| Larry       | 1.4134691557041081 |
| Sam         | 1.1408822407395414 |
| Robert      | 1.0948494543273461 |
+-------------+--------------------+
6 rows in set (0.00 sec)

補足:もっとシンプルな書き方

ランダムな並べ替えだけであれば、サブクエリを使わずにORDER BY RAND()を直接指定する方法もあります。

mysql> SELECT * FROM DemoTable ORDER BY RAND();

ただし、この方法はテーブルの全行に対して乱数を計算するため、大規模なテーブルではパフォーマンスが低下する点に注意が必要です。小規模なテーブルでのランダム表示や抽選処理などに活用すると便利です。

  1. MySQLのSET句で予約語「ADD」列の値をインクリメントする方法

    はじめにMySQLでは「ADD」は予約語として登録されているため、列名に使用する際はバッククォート(`` `ADD` ``)で囲む必要があります。本記事では、実際にテーブルを作成し、「ADD」という名前の列の値をUPDATE文とSET句を使ってインクリメントする手順を解説します。サンプルテーブルの作成まず、以下のようにテーブルを作成します。mysql> create table DemoTable779 ( Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, `ADD` int);Query OK, 0 rows affected (0.47

  2. MySQLでIPアドレスを格納した列を正しくソートする方法

    MySQLでIPアドレスを文字列として保存している場合、単純に ORDER BY を使うと文字列として比較されるため、意図しない順序になってしまうことがあります。例えば「192.168.110.87」が「192.168.110.78」より前に来てしまうといったケースです。この問題を解決するには、INET_ATON() 関数を使用します。INET_ATON() はIPアドレスの文字列を数値に変換する関数で、これを ORDER BY と組み合わせることで、数値として正しくソートできるようになります。テーブルの作成まず、サンプル用のテーブルを作成しましょう。mysql> create tabl