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

MySQLでテーブルからランダムな行を取得する方法【PREPAREステートメント活用】

MySQLでテーブルからランダムな行を取得したい場合、PREPARE(プリペアドステートメント)を利用する方法が便利です。この手法では、乱数を使ってオフセット値を動的に生成し、それを組み込んだSQL文を準備・実行します。まずはサンプルとなるテーブルを作成しましょう。

mysql> create table DemoTable(
    FirstName varchar(100),
    CountryName varchar(100)
);
Query OK, 0 rows affected (0.53 sec)

テーブルへのデータ挿入

続いて、INSERTコマンドを使用してテーブルにいくつかのレコードを登録します。

mysql> insert into DemoTable values('Adam','US');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('Chris','AUS');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('Robert','UK');
Query OK, 1 row affected (0.32 sec)

登録済みレコードの確認

SELECTステートメントを実行し、テーブル内のすべてのレコードを表示してみましょう。

mysql> select *from DemoTable;

実行すると、以下のように3件のレコードが出力されます。

+-----------+-------------+
| FirstName | CountryName |
+-----------+-------------+
| Adam      | US           |
| Chris      | AUS          |
| Robert     | UK           |
+-----------+-------------+
3 rows in set (0.00 sec)

ランダムな行を1件取得するクエリ

ここからが本題です。以下の一連のクエリを実行すると、テーブルからランダムに行をフェッチできます。

mysql> set @value := ROUND((select count(*) from DemoTable) * rand());
Query OK, 0 rows affected (0.00 sec)
mysql> set @query := CONCAT('select *from DemoTable LIMIT ', @value , ', 1');
Query OK, 0 rows affected (0.00 sec)
mysql> prepare myStatement from @query ;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> execute myStatement;
+-----------+-------------+
| FirstName | CountryName |
+-----------+-------------+
| Chris      | AUS          |
+-----------+-------------+
1 row in set (0.00 sec)
mysql> deallocate prepare myStatement;
Query OK, 0 rows affected (0.00 sec)

上記の例では「Chris / AUS」の行が選択されましたが、実行するたびに結果は変化します。

クエリの仕組み

  • @value:COUNT(*)で取得したテーブルの総行数にRAND()の乱数値を掛け、ROUND()で四捨五入することで、ランダムなオフセット値を生成します。
  • @query:CONCAT()関数を使い、「LIMIT オフセット, 1」という形式のSELECT文を動的に組み立てます。
  • prepare / execute:組み立てたSQLをプリペアステートメントとして準備し、実行します。
  • deallocate prepare:使用後はステートメントを解放し、リソースをクリーンアップします。

なお、小規模なテーブルであれば「ORDER BY RAND() LIMIT 1」でも同様の結果が得られます。ただし、行数の多い大規模テーブルでは並べ替えのコストが大きくなるため、状況に応じて本記事のようなオフセット方式を使い分けるとよいでしょう。

  1. MySQLで1つのテーブルから別のテーブルに行をコピーする方法【INSERT INTO SELECT文の使い方】

    MySQLでテーブル間の行コピーを実現する方法MySQLであるテーブルから別のテーブルへ行(レコード)をコピーしたい場合は、INSERT INTO SELECT文を使用します。この文を使えば、SELECT句で取得したデータをそのまま別のテーブルに挿入できるため、WHERE句による条件指定と組み合わせれば、必要な行だけを効率よくコピーすることも可能です。ここでは、実際にサンプルテーブルを作成し、行をコピーする手順を順番に解説します。手順1:コピー元のテーブルを作成するまず、コピー元となるテーブル「DemoTable1879」を作成します。mysql> create table DemoTa

  2. MySQLのDELETE文とIN句を組み合わせて1つのクエリで複数レコードを削除する方法

    MySQLでは、IN()句を活用することで、複数の条件値に一致するレコードを1つのDELETEクエリでまとめて削除できます。個別に削除クエリを実行する必要がなく、効率的なデータ操作が可能になります。ここでは、サンプルテーブルを作成し、実際にIN()句を使ったレコード削除の手順を解説します。1. サンプルテーブルの作成まず、テーブルを作成しましょう。mysql> create table DemoTable1922 ( StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY, StudentName varchar(20)