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();
ただし、この方法はテーブルの全行に対して乱数を計算するため、大規模なテーブルではパフォーマンスが低下する点に注意が必要です。小規模なテーブルでのランダム表示や抽選処理などに活用すると便利です。
-
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
-
MySQLでIPアドレスを格納した列を正しくソートする方法
MySQLでIPアドレスを文字列として保存している場合、単純に ORDER BY を使うと文字列として比較されるため、意図しない順序になってしまうことがあります。例えば「192.168.110.87」が「192.168.110.78」より前に来てしまうといったケースです。この問題を解決するには、INET_ATON() 関数を使用します。INET_ATON() はIPアドレスの文字列を数値に変換する関数で、これを ORDER BY と組み合わせることで、数値として正しくソートできるようになります。テーブルの作成まず、サンプル用のテーブルを作成しましょう。mysql> create tabl