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範囲を絞るなど工夫するとよいでしょう。
-
MySQLでテーブルの最後の10件のレコードを取得する方法
MySQLでテーブルの末尾にある10行(最新の10件)を取得したい場合は、SELECT文とLIMIT句を組み合わせたサブクエリを利用します。この記事では、実際にテーブルを作成し、データを挿入しながら、最後の10件を取得するクエリの手順を具体的に解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected
-
MySQLでテーブル内の特定の行だけを削除する方法|NOT IN()を使った実践テクニック
MySQLで特定の行以外を一括削除したい場合、NOT IN() 演算子を使用すると簡単に実現できます。NOT IN() は「指定した値のリストに含まれない行」を対象にできるため、残したい行のIDを列挙すれば、それ以外の行だけを効率よく削除できます。この記事では、サンプルテーブルを作成し、実際にデータを挿入してから、NOT IN() を使って特定の行のみを削除する手順を解説します。1. サンプルテーブルの作成まずは、StudentId を自動採番(AUTO_INCREMENT)に設定したテーブルを作成します。AUTO_INCREMENT=101 を指定することで、IDは101から順番に割り振られ