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

MySQLで最後の20件のレコードからランダムに5件を取得するクエリの書き方

テーブルの末尾(最後の20件)からランダムに5件のレコードを取得したい場合、ORDER BY句でレコードを並べ替え、RAND()関数を使ってランダムな順序にシャッフルし、LIMIT 5で表示件数を5件に絞ります。

ポイントは、サブクエリ(内部クエリ)で「最後の20件」を先に抽出し、その結果に対して外側のクエリでランダム並べ替えと件数制限を適用するという2段階の構造にすることです。

1. サンプルテーブルを作成する

まず、テーブルを作成します。

mysql> create table DemoTable773 (StudentId int);
Query OK, 0 rows affected (0.59 sec)

2. レコードを挿入する

INSERTコマンドを使って、テーブルにいくつかのレコードを挿入します。

mysql> insert into DemoTable773 values(100);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable773 values(200);
Query OK, 1 row affected (0.87 sec)
mysql> insert into DemoTable773 values(300);
Query OK, 1 row affected (1.59 sec)
mysql> insert into DemoTable773 values(400);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable773 values(500);
Query OK, 1 row affected (0.29 sec)
mysql> insert into DemoTable773 values(1);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable773 values(2);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable773 values(3);
Query OK, 1 row affected (0.07 sec)
mysql> insert into DemoTable773 values(4);
Query OK, 1 row affected (0.73 sec)
mysql> insert into DemoTable773 values(5);
Query OK, 1 row affected (0.77 sec)
mysql> insert into DemoTable773 values(6);
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable773 values(7);
Query OK, 1 row affected (0.24 sec)
mysql> insert into DemoTable773 values(8);
Query OK, 1 row affected (0.50 sec)
mysql> insert into DemoTable773 values(9);
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable773 values(10);
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable773 values(90);
Query OK, 1 row affected (0.26 sec)
mysql> insert into DemoTable773 values(91);
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable773 values(92);
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable773 values(93);
Query OK, 1 row affected (0.33 sec)
mysql> insert into DemoTable773 values(94);
Query OK, 1 row affected (0.38 sec)
mysql> insert into DemoTable773 values(95);
Query OK, 1 row affected (0.34 sec)
mysql> insert into DemoTable773 values(96);
Query OK, 1 row affected (0.24 sec)
mysql> insert into DemoTable773 values(97);
Query OK, 1 row affected (0.27 sec)

3. テーブルの全レコードを確認する

SELECT文でテーブル内の全レコードを表示します。

mysql> select *from DemoTable773;

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

+-----------+
| StudentId |
+-----------+
|       100 |
|       200 |
|       300 |
|       400 |
|       500 |
|         1 |
|         2 |
|         3 |
|         4 |
|         5 |
|         6 |
|         7 |
|         8 |
|         9 |
|        10 |
|        90 |
|        91 |
|        92 |
|        93 |
|        94 |
|        95 |
|        96 |
|        97 |
+-----------+
23 rows in set (0.00 sec)

合計23件のレコードが登録されていることがわかります。

4. 最後の20件からランダムに5件を取得するクエリ

以下が、最後の20件のレコードからランダムに5件を返すクエリです。

mysql> select *from (
   select * from DemoTable773
   order by StudentId desc limit 20
) AS RANDOM_OUTPUT
order by rand()
limit 5;

このクエリの仕組みは以下のとおりです。

  • 内部クエリ: order by StudentId desc limit 20 により、StudentIdの降順で並べ替えた上で先頭20件(=テーブルの最後の20件)を取得します。
  • 外部クエリ: その20件に対して order by rand() でランダムにシャッフルし、limit 5 で5件だけを取り出します。

5. 実行結果

クエリを実行すると、次のような出力が得られます(ランダムなため、実行ごとに結果は異なります)。

+-----------+
| StudentId |
+-----------+
|        95 |
|         4 |
|        10 |
|         7 |
|       300 |
+-----------+
5 rows in set (0.51 sec)

このように、サブクエリで対象レコードを絞り込んでからRAND()でシャッフルすることで、「最後の20件の中からランダムに5件を取得する」という要件をシンプルに実現できます。なお、RAND()は実行するたびに異なる結果を返すため、ページを表示するたびに異なる5件が選ばれることになります。

  1. MySQLで月の範囲を指定してレコードを取得する方法

    MySQLでは、YEAR()関数とMONTH()関数、さらにBETWEEN演算子を組み合わせることで、特定の月の範囲に該当するレコードを簡単に抽出できます。ここでは、前年の7月〜12月と当年の1月〜7月というように、年をまたいだ月の範囲でデータを取得する方法を解説します。 サンプルテーブルの作成 まず、テーブルを作成します。 mysql> create table DemoTable1795      (      Name varchar(20),      DueDate date  

  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)