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() は全行をスキャンしてソートするため、非常に大きなテーブルではパフォーマンスが低下する場合があります。小〜中規模のテーブルでの利用に適しており、大規模データでは別の手法(乱数カラムの追加やアプリケーション側での抽選など)を検討するとよいでしょう。
-
MySQLのSELECTクエリで別テーブルに存在しない行を抽出する方法(NATURAL LEFT JOIN活用)
MySQLのSELECTクエリで別テーブルに存在しない行を抽出する方法データベースの運用では、「片方のテーブルには存在するが、もう片方のテーブルには存在しないレコード」を抽出したい場面がよくあります。この記事では、2つのテーブルを作成し、NATURAL LEFT JOINを活用して差分の行を取得する方法を、実際のサンプルコードとともにわかりやすく解説します。1. 最初のテーブルを作成するまずは比較元となる最初のテーブルを作成します。 mysql> create table FirstTableDemo -> ( -> id int, -> name v
-
MySQLでテーブルの最後の10件のレコードを取得する方法
MySQLでテーブルの末尾にある10行(最新の10件)を取得したい場合は、SELECT文とLIMIT句を組み合わせたサブクエリを利用します。この記事では、実際にテーブルを作成し、データを挿入しながら、最後の10件を取得するクエリの手順を具体的に解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected