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

【MySQL】ランダムに抽出した行を特定の列名でソートする方法

MySQLでランダムな行を特定の列名順にソートして取得する方法

この記事では、MySQLのテーブルからRAND()関数を使ってランダムに行を抽出し、その結果を特定の列(ここではName列)を基準にソートして表示する方法を、実際のSQL例とともにわかりやすく解説します。

1. テーブルの作成

まず、サンプル用のテーブルを作成します。

mysql> create table DemoTable1339
    -> (
    -> Name varchar(30),
    -> Score int
    -> );
Query OK, 0 rows affected (0.76 sec)

Name(名前)とScore(スコア)の2つのカラムを持つシンプルなテーブルです。

2. レコードの挿入

INSERTコマンドを使って、テーブルに複数のレコードを挿入します。

mysql> insert into DemoTable1339 values('Chris',56);
Query OK, 1 row affected (0.36 sec)
mysql> insert into DemoTable1339 values('Bob',46);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable1339 values('Adam',78);
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable1339 values('John',90);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable1339 values('Carol',98);
Query OK, 1 row affected (0.12 sec)

3. 登録された全レコードの確認

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

mysql> select * from DemoTable1339;

実行すると、以下のような出力が得られます。

+-------+-------+
| Name  | Score |
+-------+-------+
| Chris |    56 |
| Bob   |    46 |
| Adam  |    78 |
| John  |    90 |
| Carol |    98 |
+-------+-------+
5 rows in set (0.00 sec)

5件のレコードが挿入されていることが確認できました。

4. ランダムな行をName列順にソートして取得する

本題である、「ランダムに選択した行をName列を基準にソートする」クエリは以下の通りです。

mysql> select * from (select *from DemoTable1339 order by rand() limit 4) tbl order by Name;

実行結果:

+-------+-------+
| Name  | Score |
+-------+-------+
| Adam  |    78 |
| Bob   |    46 |
| Carol |    98 |
| Chris |    56 |
+-------+-------+
4 rows in set (0.05 sec)

今回は5件中4件がランダムに抽出され、その結果がAdam、Bob、Carol、Chrisという名前の昇順にきれいに並んでいます。実行するたびに選ばれる行は変わりますが、常にName列順にソートされます。

クエリの仕組み

このクエリは、サブクエリと外部クエリという2段階の構造になっています。

  • サブクエリ部分select * from DemoTable1339 order by rand() limit 4
    RAND()関数によってテーブルの全行をランダムな順序に並べ替え、LIMIT句で上位4件だけを取り出します。
  • 外部クエリ部分select * from (...) tbl order by Name
    サブクエリの結果を一時テーブル「tbl」として扱い、そこに対してORDER BY Nameを適用して名前順に並べ替えます。

つまり「まずランダム抽選を行い、その後で指定した列順に整える」という処理を、1つのSQL文で実現しています。ORDER BY RAND()は行数が多いテーブルではパフォーマンスが低下しやすい点に注意し、小〜中規模のテーブルで活用するのがおすすめです。

  1. MySQLで特定のカラムのデータをエクスポートする方法(INTO OUTFILEの使い方)

    MySQLで特定のカラムのデータをエクスポートする方法 MySQLでテーブルから特定のカラム(列)のデータだけをファイルに書き出したい場合は、SELECT文とINTO OUTFILEを組み合わせるのが最もシンプルで確実な方法です。この記事では、実際にテーブルを作成し、データを投入したうえで、特定のカラムをテキストファイルへエクスポートする手順を順番に解説します。 基本構文 特定のカラムをファイルに出力する際の基本構文は次のとおりです。 select yourColumnName from yourTableName into outfile yourLocationOfFile; このように

  2. MySQLで特定のカラム名を持つテーブルを検索する方法

    MySQLで特定のカラム名(列名)を持つテーブルを探したい場合は、システムビューである information_schema.columns を利用します。このビューにはデータベース内のすべてのテーブルとカラムの情報が格納されているため、条件を指定して検索するだけで、目的のカラムを持つテーブルを簡単に特定できます。 基本構文 カラム名からテーブル名を検索する際の基本的な構文は以下の通りです。 select distinct table_name from information_schema.columns where column_name like %yourSearchValue% a