MySQLにはランダムな数値を取り出すRAND関数があり、これを使うことにより、テーブルからランダムにデータを取り出すことができる。


RAND関数は以下のように0以上1未満の値をランダムで返す。

> SELECT RAND();
+------------------+
| RAND()           |
+------------------+
| 0.80035871248726 |
+------------------+
1 row in set (0.00 sec)

> SELECT RAND();
+------------------+
| RAND()           |
+------------------+
| 0.44630892709485 |
+------------------+
1 row in set (0.00 sec)

このRAND関数を使ってランダムにデータを取り出す。

例えば、以下のデータがあるとする。


> SELECT * FROM book;
+----+--------------------------------+
| id | title                          |
+----+--------------------------------+
|  1 | 赤ずきん                       |
|  2 | ブレーメンの音楽隊             |
|  3 | 白雪姫                         |
|  4 | シンデレラ                     |
|  5 | ヘンゼルとグレーテル           |
|  6 | いばら姫                       |
|  7 | 靴履き猫                       |
|  8 | 眠り姫                         |
+----+--------------------------------+
8 rows in set (0.01 sec)

ここからランダムに3件のデータを取り出すときは以下のようにする。

> SELECT * FROM book ORDER BY RAND() LIMIT 3;
+----+--------------------------------+
| id | title                          |
+----+--------------------------------+
|  3 | 白雪姫                         |
|  5 | ヘンゼルとグレーテル           |
|  8 | 眠り姫                         |
+----+--------------------------------+
3 rows in set (0.00 sec)

> SELECT * FROM book ORDER BY RAND() LIMIT 3;
+----+-----------------+
| id | title           |
+----+-----------------+
|  6 | いばら姫        |
|  4 | シンデレラ      |
|  7 | 靴履き猫        |
+----+-----------------+
3 rows in set (0.01 sec)

たったこれだけでランダムに取り出すことができる。

これは何をやっているかというと、「ORDER BY RAND()」でランダムに並び変えて、「LIMIT 3」で上位3件を取り出しているだけ。 「ORDER BY RAND()」でランダムにソートできるというのがよくわからないという人は以下のようにしていると思えばわかりやすい。

> SELECT *, RAND() as r FROM book ORDER BY r;
+----+--------------------------------+-------------------+
| id | title                          | r                 |
+----+--------------------------------+-------------------+
|  3 | 白雪姫                         | 0.026458664821888 |
|  4 | シンデレラ                     | 0.212983204250208 |
|  6 | いばら姫                       | 0.288750705578132 |
|  1 | 赤ずきん                       | 0.390797205633295 |
|  7 | 靴履き猫                       | 0.487133386067239 |
|  8 | 眠り姫                         | 0.569414844335443 |
|  2 | ブレーメンの音楽隊             | 0.639770050197626 |
|  5 | ヘンゼルとグレーテル           | 0.985540057519022 |
+----+--------------------------------+-------------------+
8 rows in set (0.00 sec)

これを使えば、ある条件に当てはまるデータの中から○○件ランダムで取り出すということもできる。