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

MySQLでレコードをランダムに取得し、名前を昇順に表示する方法

MySQLでレコードをランダムに取得し、名前を昇順に表示する方法

MySQLではサブクエリ(副問い合わせ)を活用することで、レコードをランダムに並べ替えて取得した後、名前を昇順で表示することができます。ランダムな並べ替えにはRAND()関数を使用し、名前の昇順表示にはORDER BY句を使用します。

この手法は、「抽選やシャッフルのようにデータをランダムに選びつつ、最終的な表示は特定のカラム順に揃えたい」というケースで非常に役立ちます。

基本構文

select *from
(
    select *from yourTableName order by rand() limit anyIntegerValue;
) anyVariableName
order by yourColumnName;

この構文のポイントは以下の通りです。

  • 内側のサブクエリでRAND()によりレコードをランダムに並べ替え、LIMIT句で取得件数を制限します。
  • 外側のクエリで、任意のカラム(ここでは名前)を基準に昇順ソートを行います。

サンプルテーブルの作成

それでは、実際にテーブルを作成して動作を確認してみましょう。IdとNameの2つのカラムを持つテーブルを作成します。

mysql> create table OrderByRandName
    -> (
    -> Id int,
    -> Name varchar(100)
    -> );
Query OK, 0 rows affected (0.96 sec)

レコードの挿入

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

mysql> insert into OrderByRandName values(100,'John');
Query OK, 1 row affected (0.18 sec)

mysql> insert into OrderByRandName values(101,'Bob');
Query OK, 1 row affected (0.11 sec)

mysql> insert into OrderByRandName values(102,'Johnson');
Query OK, 1 row affected (0.19 sec)

mysql> insert into OrderByRandName values(103,'David');
Query OK, 1 row affected (0.22 sec)

mysql> insert into OrderByRandName values(104,'Smith');
Query OK, 1 row affected (0.17 sec)

mysql> insert into OrderByRandName values(105,'Taylor');
Query OK, 1 row affected (0.20 sec)

mysql> insert into OrderByRandName values(106,'Sam');
Query OK, 1 row affected (0.12 sec)

mysql> insert into OrderByRandName values(107,'Robert');
Query OK, 1 row affected (0.22 sec)

mysql> insert into OrderByRandName values(108,'Michael');
Query OK, 1 row affected (0.16 sec)

mysql> insert into OrderByRandName values(109,'Mark');
Query OK, 1 row affected (0.17 sec)

登録済みレコードの確認

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

mysql> select *from OrderByRandName;

以下が出力結果です。

+------+---------+
| Id   | Name    |
+------+---------+
|  100 | John    |
|  101 | Bob     |
|  102 | Johnson |
|  103 | David   |
|  104 | Smith   |
|  105 | Taylor  |
|  106 | Sam     |
|  107 | Robert  |
|  108 | Michael |
|  109 | Mark    |
+------+---------+
10 rows in set (0.00 sec)

RAND()とORDER BYを組み合わせたクエリ

ここからが本題です。以下のクエリでは、まずRAND()でレコードをランダムに並べ替え、その後外側のクエリでNameカラムを基準に昇順ソートしています。

mysql> select *from
    -> (
    -> select *from OrderByRandName order by rand() limit 10
    -> )tbl1
    -> order by Name;

以下が出力結果です。

+------+---------+
| Id   | Name    |
+------+---------+
|  101 | Bob     |
|  103 | David   |
|  100 | John    |
|  102 | Johnson |
|  109 | Mark    |
|  108 | Michael |
|  107 | Robert  |
|  106 | Sam     |
|  104 | Smith   |
|  105 | Taylor  |
+------+---------+
10 rows in set (0.39 sec)

出力結果を見ると、Idの順番はバラバラですが、Name列がアルファベット順(昇順)にきちんと整列していることがわかります。このように、サブクエリでランダム抽出を行い、外側のクエリで最終的な並び順を制御することで、両方の要件を同時に満たすことができます。

注意点

ORDER BY RAND()は、対象テーブルの全行に対して乱数を計算してソートするため、レコード数が非常に多いテーブルではパフォーマンスが低下する可能性があります。大規模なテーブルを扱う場合は、事前にID範囲を絞り込むなどの工夫を検討するとよいでしょう。

  1. MySQLでレコードを並べ替えて先頭のn行を削除する方法

    MySQLでは、DELETE文にORDER BY句とLIMIT句を組み合わせることで、特定の順序で並べ替えたレコードのうち、先頭からn行を削除できます。この記事では、実際のSQL文と実行結果を交えながら、その手順をわかりやすく解説します。1. テーブルを作成するまず、サンプル用のテーブルを作成しましょう。mysql> create table DemoTable -> ( -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, -> FirstName varchar(20) -> );Query OK

  2. MySQLで特定の値を先頭に表示し、残りのレコードを昇順で並べ替える方法

    はじめにMySQLでは、ORDER BY句に条件式を組み合わせることで、特定の値を持つ行を最前面に表示し、残りの行を昇順で並べ替えることができます。この記事では、具体的な手順をサンプルコードとともに解説します。テーブルの作成まず、サンプル用のテーブルを作成します。mysql> create table DemoTable -> ( -> MonthNumber int -> );Query OK, 0 rows affected (1.68 sec)レコードの挿入次に、INSERTコマンドを使ってテーブルに複数のレコードを挿入します。mysql>