MySQLで最新の20行からランダムに5行を選択する方法
MySQLで最新の20行からランダムに5行を選択する方法
ランダムな行を取得するには RAND() 関数を、取得する行数を制限するには LIMIT 句を使用します。
この記事では、テーブルの最新20行の中からランダムに5行を抽出するSQLクエリの書き方を、サンプルテーブルを使いながら順を追って解説します。
1. サンプルテーブルを作成する
まず、出荷日(ShippingDate)を格納するテーブルを作成します。
mysql> create table DemoTable
-> (
-> ShippingDate datetime
-> );
Query OK, 0 rows affected (0.51 sec)
2. レコードを挿入する
INSERT文を使って、2019年1月から5月にかけての日付データを合計29件挿入します。以下はその一部です。
mysql> insert into DemoTable values('2019-01-01');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('2019-01-03');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('2019-01-05');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('2019-01-07');
Query OK, 1 row affected (0.11 sec)
...(以降も同様に、2019-05-18までの合計29件のレコードを挿入)3. テーブルの全レコードを確認する
SELECT文で、テーブル内のすべてのレコードを表示します。
mysql> select *from DemoTable;
実行結果は以下のとおりです。
+---------------------+
| ShippingDate |
+---------------------+
| 2019-01-01 00:00:00 |
| 2019-01-03 00:00:00 |
| 2019-01-05 00:00:00 |
| 2019-01-07 00:00:00 |
| 2019-02-02 00:00:00 |
| 2019-02-04 00:00:00 |
| 2019-02-12 00:00:00 |
| 2019-02-24 00:00:00 |
| 2019-02-25 00:00:00 |
| 2019-03-10 00:00:00 |
| 2019-03-11 00:00:00 |
| 2019-03-12 00:00:00 |
| 2019-03-14 00:00:00 |
| 2019-03-16 00:00:00 |
| 2019-03-18 00:00:00 |
| 2019-03-20 00:00:00 |
| 2019-03-25 00:00:00 |
| 2019-03-28 00:00:00 |
| 2019-03-29 00:00:00 |
| 2019-04-03 00:00:00 |
| 2019-04-03 00:00:00 |
| 2019-04-04 00:00:00 |
| 2019-04-06 00:00:00 |
| 2019-04-09 00:00:00 |
| 2019-05-01 00:00:00 |
| 2019-05-13 00:00:00 |
| 2019-05-15 00:00:00 |
| 2019-05-16 00:00:00 |
| 2019-05-18 00:00:00 |
+---------------------+
29 rows in set (0.00 sec)
4. 最新20行からランダムに5行を選択する
ここが本題となるクエリです。まずサブクエリで出荷日の降順に並べ替えて最新20行を取得し、その結果に対して外側のクエリで ORDER BY RAND() を使ってランダムに並べ替え、LIMIT 5 で5行だけを取り出します。
mysql> select tbl1.* from (select *from DemoTable ORDER BY ShippingDate DESC LIMIT 20 ) as tbl1
-> ORDER BY RAND() LIMIT 5;
実行結果は以下のとおりです。クエリを実行するたびに、異なる5行がランダムに表示されます。
+---------------------+
| ShippingDate |
+---------------------+
| 2019-03-14 00:00:00 |
| 2019-05-13 00:00:00 |
| 2019-03-25 00:00:00 |
| 2019-05-16 00:00:00 |
| 2019-03-10 00:00:00 |
+---------------------+
5 rows in set (0.04 sec)
クエリの仕組みのポイント
- 内側のサブクエリ
(select * from DemoTable ORDER BY ShippingDate DESC LIMIT 20)で、日付の新しい順に20行を取得します。 - 外側のクエリで
ORDER BY RAND()を適用し、その20行をランダムな順序に並べ替えます。 - 最後に
LIMIT 5で、並べ替えた結果の先頭5行だけを返します。
このように、サブクエリとRAND()関数を組み合わせることで、「最新のN行の中からランダムにM行を取得する」という処理をシンプルなSQLで実現できます。応用すれば、取得する行数や対象範囲も自由に変更できます。
-
MySQLで日付の範囲から日付リストを生成する方法
MySQLで日付の範囲から日付リストを生成する方法 MySQLでは、adddate()関数と複数の派生テーブル(数字テーブル)を組み合わせたクエリを使うことで、指定した期間内のすべての日付を簡単に生成できます。 以下の例では、2016-12-15から2016-12-31までの日付を一覧として生成しています。 日付を生成するSQLクエリ mysql> select * from -> (select adddate(1970-01-01,t4*10000 + t3*1000 + t2*100 + t1*10 + t0) gen_date from -> (se
-
MySQLでテーブルの最後の10件のレコードを取得する方法
MySQLでテーブルの末尾にある10行(最新の10件)を取得したい場合は、SELECT文とLIMIT句を組み合わせたサブクエリを利用します。この記事では、実際にテーブルを作成し、データを挿入しながら、最後の10件を取得するクエリの手順を具体的に解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected