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

MySQLで最初の行をランダムにし、残りを基準順に並べ替える方法

はじめに

MySQLでは、「特定の条件に該当する行だけをランダムな順序で表示し、それ以外の行は指定した基準に従って並べ替えたい」というケースがあります。このような場合には、ORDER BY CASE句を使用することで簡単に実現できます。本記事では、サンプルコードとともに具体的な手順を解説します。

サンプルテーブルの作成

まず、動作確認用のテーブルを作成します。

mysql> create table DemoTable1926
    (
    Position varchar(20),
    Number int
    );
Query OK, 0 rows affected (0.00 sec)

レコードの挿入

次に、INSERTコマンドを使ってテーブルにデータを挿入していきます。

mysql> insert into DemoTable1926 values('Highest',50);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1926 values('Highest',30);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1926 values('Lowest',100);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1926 values('Lowest',120);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1926 values('Lowest',90);
Query OK, 1 row affected (0.00 sec)

テーブルの内容を確認する

SELECT文を実行して、テーブル内のすべてのレコードを表示してみましょう。

mysql> select * from DemoTable1926;

実行すると、以下のような結果が得られます。

+----------+--------+
| Position | Number |
+----------+--------+
| Highest  |     50 |
| Highest  |     30 |
| Lowest   |    100 |
| Lowest   |    120 |
| Lowest   |     90 |
+----------+--------+
5 rows in set (0.00 sec)

最初の行をランダム化し、残りを基準順に並べ替えるクエリ

それでは本題です。「Position」列が「Highest」の行はランダムな順序で表示し、「Lowest」の行はNumber列の昇順で並べ替えるには、次のようにクエリを記述します。

mysql> select * from DemoTable1926
    order by Position desc,case Position when 'Highest' then rand()
    else Number end asc;

このクエリを実行すると、以下のような出力になります。

+----------+--------+
| Position | Number |
+----------+--------+
| Lowest   |     90 |
| Lowest   |    100 |
| Lowest   |    120 |
| Highest  |     50 |
| Highest  |     30 |
+----------+--------+
5 rows in set (0.00 sec)

クエリの仕組み

このクエリが期待どおりに動作する仕組みは、以下の2つの要素に分けられます。

  • order by Position desc:まず「Position」列を降順にソートすることで、「Lowest」グループが先頭に配置されます。
  • case Position when 'Highest' then rand() else Number end asc:続くCASE式では、「Highest」の行に対してはRAND()関数が返すランダムな値でソートされ、「Lowest」の行に対してはNumber列の値で昇順ソートされます。

このようにORDER BY句の中でCASE式を組み合わせることで、グループごとに異なるソート基準(ランダム順・昇順など)を柔軟に適用できます。ランキング表示や優先度の異なるデータの一覧など、さまざまな場面で応用できるテクニックなので、ぜひ覚えておきましょう。

  1. MySQLで現在の日付より前の日付データを抽出する方法

    MySQLでは、NOW() 関数と比較演算子を使うことで、現在の日時より前の日付を持つレコードを簡単に抽出できます。この記事では、実際にテーブルを作成し、サンプルデータを登録したうえで、現在日時より過去の日付レコードを取得する手順を解説します。 1. サンプルテーブルの作成 まず、日付型(DATETIME)のカラムを持つテーブルを作成しましょう。 mysql> create table DemoTable1877 ( DueDate datetime ); Query OK, 0 rows affected (0.00 sec) 2. テストデータの挿入 次に、IN

  2. MySQLのCONCAT_WS()関数で文字列を連結しながら条件に一致する行を抽出する方法

    MySQLのCONCAT_WS()関数とはMySQLでは、CONCAT_WS()関数を使用することで、複数のカラムや値を指定した区切り文字で連結できます。さらにWHERE句と組み合わせれば、条件に一致する行だけを抽出しながら、読みやすい形式の文字列として出力することも可能です。この記事では、実際にテーブルを作成し、CONCAT_WS()と条件指定を組み合わせたクエリの実行例を順番に解説します。サンプルテーブルの作成まず、ユーザー情報を格納するテーブル「demo38」を作成しましょう。mysql> create table demo38-> (-> user_id int,-&