MySQLで毎回異なる行をランダムに取得する方法:RAND()関数とORDER BY、LIMITの組み合わせ
MySQLでランダムな結果セットを毎回変える方法
MySQLでは、RAND()関数をORDER BY句およびLIMIT句と組み合わせて使用することで、クエリを実行するたびに異なる行や値のセットをランダムに取得できます。この仕組みは、テーブルの全行に対してランダムな値を生成して並べ替えを行い、その上位N件を返すというものです。
実際の動作を確認するために、以下のようなレコードを持つ「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)
RAND()を使ったランダム取得の実行例
次のクエリでは、RAND()関数をORDER BY句とLIMIT句と組み合わせて使用しています。同じクエリを複数回実行すると、結果がどう変わるか見てみましょう。
mysql> Select * from employee ORDER BY RAND() LIMIT 4; +----+-------+--------+ | ID | Name | Salary | +----+-------+--------+ | 5 | Ram | 20000 | | 4 | Aarav | 65000 | | 6 | Mohan | 30000 | | 8 | Vinay | NULL | +----+-------+--------+ 4 rows in set (0.00 sec) mysql> Select * from employee ORDER BY RAND() LIMIT 4; +----+--------+--------+ | ID | Name | Salary | +----+--------+--------+ | 6 | Mohan | 30000 | | 8 | Vinay | NULL | | 2 | Rahul | 20000 | | 1 | Gaurav | 50000 | +----+--------+--------+ 4 rows in set (0.03 sec) mysql> Select * from employee ORDER BY RAND() LIMIT 4; +----+-------+--------+ | ID | Name | Salary | +----+-------+--------+ | 3 | Advik | 25000 | | 8 | Vinay | NULL | | 7 | Aryan | NULL | | 5 | Ram | 20000 | +----+-------+--------+ 4 rows in set (0.00 sec)
結果の解説
上記の結果セットから分かるように、まったく同じクエリを実行しているにもかかわらず、実行するたびに異なる行がランダムな順序で返されています。
これは、ORDER BY RAND()が各行に対して0以上1未満のランダムな浮動小数点値を生成し、その値に基づいて行を並べ替えるためです。ランダム値はクエリ実行ごとに新しく生成されるため、並び順も毎回変わり、LIMIT 4によって先頭の4行だけが抽出される結果として、取得される行の組み合わせも実行ごとに異なるものになります。
注意点:パフォーマンスについて
ORDER BY RAND()は便利な一方で、大きなテーブルに対してはパフォーマンス上の注意が必要です。MySQLはすべての行に対してランダム値を計算し、それをソートする必要があるため、行数が多いテーブルでは処理コストが高くなります。大規模なテーブルからランダムに行を取得したい場合は、IDの範囲からランダムな数値を生成して該当行を取得する方法など、代替手法を検討するとよいでしょう。
-
MySQLでカンマ区切りの値が格納されたテーブル内を検索する方法
MySQLでカンマ区切りの値を検索するには カンマ区切りの値が格納されたカラムを持つテーブル内を検索するには、LIKE演算子を使用します。まずはサンプル用のテーブルを作成しましょう。 mysql> create table DemoTable675(Value text); Query OK, 0 rows affected (0.55 sec) レコードの挿入 insertコマンドを使って、テーブルにいくつかのレコードを挿入します。 mysql> insert into DemoTable675 values(10,56,49484,93993,211,4594); Query
-
MySQLでAUTO_INCREMENTの値を1から再スタートさせる方法
MySQLでAUTO_INCREMENT(自動採番)の値を1から振り直したい場合は、TRUNCATEでテーブルを初期化するのが最も簡単な方法です。ここでは、実際にサンプルテーブルを作成し、動作を順番に確認していきましょう。サンプルテーブルの作成まず、AUTO_INCREMENT列を持つテーブルを作成します。mysql> create table DemoTable ( StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY ); Query OK, 0 rows affected (1.44 sec)次に、INSERTコマンドで複数のレ