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

MySQLで最新50件のレコードからランダムに5行だけ抽出する方法

MySQLでテーブルの末尾(最新)50件の中から、さらにランダムに5行だけ取り出したい場合は、サブクエリと ORDER BY RAND() を組み合わせるのが効果的です。この記事では、実際にテーブルを作成しながら手順を解説します。

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

まずは動作確認用のテーブルを作成しましょう。

mysql> create table DemoTable1853
    (
    UserId int NOT NULL AUTO_INCREMENT,
    PRIMARY KEY(UserId)
    );
Query OK, 0 rows affected (0.00 sec)

2. テストデータを挿入する

INSERTコマンドで58件のレコードを一括挿入します。VALUESに空のかっこ「()」を並べることで、AUTO_INCREMENTによる連番データを簡単に生成できます。

mysql> insert into DemoTable1853 values(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),();
Query OK, 58 rows affected (0.00 sec)
Records: 58  Duplicates: 0  Warnings: 0

3. 登録された全レコードを確認する

SELECT文でテーブルの中身を確認してみましょう。

mysql> select * from DemoTable1853;

実行すると、UserIdが1〜58まで連番で登録されていることがわかります。

+--------+
| UserId |
+--------+
|      1 |
|      2 |
|      3 |
|      4 |
|      5 |
|      6 |
|      7 |
|      8 |
|      9 |
|     10 |
|     11 |
|     12 |
|     13 |
|     14 |
|     15 |
|     16 |
|     17 |
|     18 |
|     19 |
|     20 |
|     21 |
|     22 |
|     23 |
|     24 |
|     25 |
|     26 |
|     27 |
|     28 |
|     29 |
|     30 |
|     31 |
|     32 |
|     33 |
|     34 |
|     35 |
|     36 |
|     37 |
|     38 |
|     39 |
|     40 |
|     41 |
|     42 |
|     43 |
|     44 |
|     45 |
|     46 |
|     47 |
|     48 |
|     49 |
|     50 |
|     51 |
|     52 |
|     53 |
|     54 |
|     55 |
|     56 |
|     57 |
|     58 |
+--------+
58 rows in set (0.00 sec)

4. 最新50件からランダムに5行を取得するクエリ

ここが本題です。ポイントは2段階の処理に分けることです。

  • 内側のサブクエリ: UserIdの降順(DESC)で並べ替え、LIMIT 50で最新50件を絞り込む
  • 外側のクエリ: 絞り込まれた50件に対して ORDER BY RAND() でシャッフルし、LIMIT 5で5行だけ取得する
mysql> select tbl.*
    from (select tbl1.*
          from DemoTable1853 tbl1
          order by UserId DESC
          LIMIT 50
         ) tbl
    order by rand()
    limit 5;

5. 実行結果

クエリを実行すると、最新50件(UserId:9〜58)の中からランダムに選ばれた5行が返されます。

+--------+
| UserId |
+--------+
|     19 |
|     24 |
|     43 |
|     36 |
|     48 |
+--------+
5 rows in set (0.00 sec)

補足:なぜサブクエリが必要なのか

単純に ORDER BY RAND() LIMIT 5 と書くと、テーブル全体からランダムに選ばれてしまい、「最新50件」という条件を満たせません。先にLIMITで対象範囲を絞ってからランダム抽出することで、意図した通りの結果が得られます。

なお、ORDER BY RAND()は対象行数が多いとパフォーマンスが低下するため、大規模テーブルでは事前にID範囲を絞るなど工夫するとよいでしょう。

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

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

  2. MySQLでテーブル内の特定の行だけを削除する方法|NOT IN()を使った実践テクニック

    MySQLで特定の行以外を一括削除したい場合、NOT IN() 演算子を使用すると簡単に実現できます。NOT IN() は「指定した値のリストに含まれない行」を対象にできるため、残したい行のIDを列挙すれば、それ以外の行だけを効率よく削除できます。この記事では、サンプルテーブルを作成し、実際にデータを挿入してから、NOT IN() を使って特定の行のみを削除する手順を解説します。1. サンプルテーブルの作成まずは、StudentId を自動採番(AUTO_INCREMENT)に設定したテーブルを作成します。AUTO_INCREMENT=101 を指定することで、IDは101から順番に割り振られ