MySQLでランダムな行を取得する方法|ORDER BY RAND()を使った抽出テクニック
MySQLでランダムな行を取得する基本
MySQLでランダムに行を取得したい場合、最も手軽な方法は ORDER BY RAND() を使うことです。この記事では、カンマ区切りの値を格納したデータを例に、特定の値を除外しながらランダムに行を抽出する方法をステップごとに解説します。
1. サンプルテーブルを作成する
まず、IDのリストを保存するためのシンプルなテーブルを作成します。
mysql> create table DemoTable1835
(
ListOfIds varchar(20)
);
Query OK, 0 rows affected (0.00 sec)
2. レコードを挿入する
続いて、INSERTコマンドでカンマ区切りの値を持つレコードをいくつか挿入します。
mysql> insert into DemoTable1835 values('10,20,30');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1835 values('70,80,90');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1835 values('45,67,89');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1835 values('98,96,49');
Query OK, 1 row affected (0.00 sec)3. テーブルの中身を確認する
SELECT文で登録済みの全レコードを表示してみましょう。
mysql> select * from DemoTable1835;
以下のような結果が出力されます。
+-----------+
| ListOfIds |
+-----------+
| 10,20,30 |
| 70,80,90 |
| 45,67,89 |
| 98,96,49 |
+-----------+
4 rows in set (0.00 sec)
4. ランダムに行を取得するクエリ
ここからが本題です。NOT IN句で特定の値(10・20・70)を含む行を除外し、ORDER BY RAND() でランダムに並べ替え、さらにLIMIT句で2件だけ取得します。
mysql> select * from DemoTable1835
where ListOfIds NOT IN(10,20,70) order by rand()
limit 2;
実行するたびに異なる組み合わせで、以下のように2件の行が出力されます。
+-----------+
| ListOfIds |
+-----------+
| 98,96,49 |
| 45,67,89 |
+-----------+
2 rows in set, 4 warnings (0.00 sec)
補足:ORDER BY RAND()を使う際の注意点
ORDER BY RAND()は非常に便利ですが、テーブル内のすべての行に対して乱数を生成しソートを行う仕組みのため、大規模なテーブルではパフォーマンスが低下する可能性があります。数千行程度の小〜中規模データでの利用がおすすめです。
また、実行結果に「4 warnings」と表示されるのは、varchar型のカラムを数値リスト(10,20,70)と比較した際に暗黙的な型変換が発生するためです。より厳密に扱いたい場合は、引用符付きの文字列('10','20','70')で比較すると安全です。
-
MySQLの1つのクエリで複数行を挿入する方法を解説
はじめにMySQLでは、INSERT文のVALUES()句をカンマ(,)で区切って並べることで、1つのクエリで複数の行をまとめて挿入できます。この方法を使うと、行ごとに個別のINSERT文を実行する場合と比べて、処理が高速になり、コードもすっきりします。基本構文insert into テーブル名 values(値1,値2,...N),(値1,値2,...N),(値1,値2,...N),...N;このように、values()の中に各行のデータを記述し、複数のvalues()をカンマで連結することで、一度の実行で任意の数の行を挿入できます。サンプルテーブルの作成実際に複数行を挿入してみるために、ま
-
PHPとMySQLでブール値を扱うには?BOOL・BOOLEAN・TINYINT(1)の違いと使い方
本記事では、MySQL 8.0.12を使用して、ブール(Boolean)値の正しい取り扱い方を解説します。まず、使用しているMySQLのバージョンを確認しておきましょう。 mysql> select version(); +-----------+ | version() | +-----------+ | 8.0.12 | +-----------+ 1 row in set (0.00 sec) MySQLにおけるブール値の基本:BOOL・BOOLEAN・TINYINT(1) MySQLでブール値を扱うには、BOOL、BOOLEAN、またはTINYINT(1)のいずれかを使用