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

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で実現できます。応用すれば、取得する行数や対象範囲も自由に変更できます。

  1. 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

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

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