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

MySQLでテーブルから重複のない行をランダムに選択する方法

MySQLでテーブルから行をランダムに選択するには、ORDER BY RAND()LIMIT を組み合わせて使用します。さらに、重複のない(一意な)行だけを取得したい場合は DISTINCT を併用します。

この記事では、実際にテーブルを作成し、データを挿入して、ランダムに一意な行を取得する手順を具体的に解説します。

サンプルテーブルの作成

まず、例として以下のようなテーブルを作成します。

mysql> create table DemoTable
(
    Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    Name varchar(40)
);
Query OK, 0 rows affected (0.54 sec)

テストデータの挿入

次に、INSERT文を使って複数のレコードを挿入します。あえて同じ名前を重複して登録している点に注目してください。

mysql> insert into DemoTable(Name) values('John Doe');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable(Name) values('Chris Brown');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable(Name) values('Adam Smith');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable(Name) values('John Doe');
Query OK, 1 row affected (0.24 sec)
mysql> insert into DemoTable(Name) values('John Doe');
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable(Name) values('Chris Brown');
Query OK, 1 row affected (0.53 sec)
mysql> insert into DemoTable(Name) values('Adam Smith');
Query OK, 1 row affected (0.12 sec)

登録済みレコードの確認

SELECT文ですべてのレコードを表示してみましょう。

mysql> select *from DemoTable;

実行結果は以下のとおりです。7件のレコードが登録されており、「John Doe」「Chris Brown」「Adam Smith」がそれぞれ重複しています。

+----+-------------+
| Id | Name        |
+----+-------------+
|  1 | John Doe    |
|  2 | Chris Brown |
|  3 | Adam Smith  |
|  4 | John Doe    |
|  5 | John Doe    |
|  6 | Chris Brown |
|  7 | Adam Smith  |
+----+-------------+
7 rows in set (0.00 sec)

重複のない行をランダムに取得するクエリ

ここで本題です。DISTINCT で名前の重複を排除し、ORDER BY RAND() でランダムな順序に並べ替え、LIMIT で取得件数を制限します。

mysql> select distinct Name from DemoTable order by rand() limit 3;

実行結果は以下のとおりです。重複が排除され、3つの一意な名前がランダムな順序で返されます。実行するたびに表示順序は変わります。

+-------------+
| Name        |
+-------------+
| Chris Brown |
| John Doe    |
| Adam Smith  |
+-------------+
3 rows in set (0.00 sec)

ポイントまとめ

  • ORDER BY RAND():行をランダムな順序で並べ替えます。
  • DISTINCT:指定カラムの重複値を排除し、一意な行のみを返します。
  • LIMIT:取得する行数を制限します。

なお、ORDER BY RAND() は全行をスキャンしてソートするため、非常に大きなテーブルではパフォーマンスが低下する場合があります。小〜中規模のテーブルでの利用に適しており、大規模データでは別の手法(乱数カラムの追加やアプリケーション側での抽選など)を検討するとよいでしょう。

  1. MySQLのSELECTクエリで別テーブルに存在しない行を抽出する方法(NATURAL LEFT JOIN活用)

    MySQLのSELECTクエリで別テーブルに存在しない行を抽出する方法データベースの運用では、「片方のテーブルには存在するが、もう片方のテーブルには存在しないレコード」を抽出したい場面がよくあります。この記事では、2つのテーブルを作成し、NATURAL LEFT JOINを活用して差分の行を取得する方法を、実際のサンプルコードとともにわかりやすく解説します。1. 最初のテーブルを作成するまずは比較元となる最初のテーブルを作成します。 mysql> create table FirstTableDemo -> ( -> id int, -> name v

  2. MySQLでテーブルの最後の10件のレコードを取得する方法

    MySQLでテーブルの末尾にある10行(最新の10件)を取得したい場合は、SELECT文とLIMIT句を組み合わせたサブクエリを利用します。この記事では、実際にテーブルを作成し、データを挿入しながら、最後の10件を取得するクエリの手順を具体的に解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected