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

MySQLでRAND()によるランダム並べ替えをしながらグループを維持する方法

MySQLではRAND()関数を使ってレコードをランダムに並べ替えられますが、単純にORDER BY RAND()を使うと、同じ値を持つレコードまでバラバラに散らばってしまうことがあります。本記事では、全体をランダムにシャッフルしながら、同じ値(この例では学生の点数)を持つレコード同士はグループとしてまとめて表示する方法を、具体的な手順とともに解説します。

サンプルテーブルの作成

まず、テーブルを作成しましょう。

mysql> create table DemoTable
    -> (
    -> StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> StudentMarks int
    -> );
Query OK, 0 rows affected (0.58 sec)

レコードの挿入

続いて、INSERTコマンドでレコードを挿入します。ここでは、後ほどグループ化の動作を確認できるよう、意図的に重複する点数のデータも含めています。

mysql> insert into DemoTable(StudentMarks) values(98);
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable(StudentMarks) values(98);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable(StudentMarks) values(78);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable(StudentMarks) values(78);
Query OK, 1 row affected (0.29 sec)
mysql> insert into DemoTable(StudentMarks) values(45);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable(StudentMarks) values(56);
Query OK, 1 row affected (0.09 sec)

テーブル内の全レコードを確認

SELECT文ですべてのレコードを表示してみましょう。

mysql> select *from DemoTable;

実行結果は以下のとおりです。

+-----------+--------------+
| StudentId | StudentMarks |
+-----------+--------------+
| 1         | 98           |
| 2         | 98           |
| 3         | 78           |
| 4         | 78           |
| 5         | 45           |
| 6         | 56           |
+-----------+--------------+
6 rows in set (0.00 sec)

この時点では、点数「98」が2件、「78」が2件と、同じ値のレコードが登録されていることがわかります。

RAND()でランダム並べ替えしつつグループを維持するクエリ

同じ値のレコードをグループ化したまま、全体をランダムに並べ替えるには、次のようなクエリを実行します。

mysql> select *from DemoTable order by rand(StudentMarks*100*RAND());

実行結果は以下のとおりです。ご覧のとおり、点数「98」のレコードはグループ化されたまま表示されています。

+-----------+--------------+
| StudentId | StudentMarks |
+-----------+--------------+
| 3         | 78           |
| 6         | 56           |
| 5         | 45           |
| 4         | 78           |
| 1         | 98           |
| 2         | 98           |
+-----------+--------------+
6 rows in set (0.00 sec)

仕組みのポイント

rand(StudentMarks*100*RAND()) のように、列の値をもとにした式をシード値としてRAND()関数に渡すのがポイントです。同じ点数を持つレコードは同じシード値になるため、同一の乱数が生成され、ソート時に必ず隣接して並びます。その結果、グループ内部の順序は保たれたまま、グループ同士の並び順だけがランダムに入れ替わるという動作を実現できます。

  1. MySQLのORDER BY ASCでNULL値を最下部に表示する方法

    MySQLのORDER BY ASCでNULL値を最下部に表示する方法MySQLでは、ORDER BY句を昇順(ASC)で使用した場合、デフォルトではNULLが先頭(上部)に表示されます。しかし実務では、「NULLは一番下に表示したい」というケースがよくあります。このような場合には、CASE式とORDER BYを組み合わせることで簡単に実現できます。この記事では、NULLや空文字列()を含むデータを昇順ソートしつつ、NULLを最下部に表示する方法を、具体的なサンプルコードとともに解説します。1. サンプルテーブルの作成まず、テーブルを作成します。mysql> create table D

  2. C言語のrand()関数とsrand()関数:擬似乱数の生成方法を解説

    rand()関数とはrand()関数は、C言語で擬似乱数を生成するために使用される標準ライブラリ関数です。戻り値は整数型で、0からRAND_MAX(一般的に32767)までの範囲の値を返します。この関数を使用するには、ヘッダーファイル「stdlib.h」をインクルードする必要があります。C言語におけるrand()の構文は以下の通りです。int rand(void);rand()の使用例#include <stdio.h> #include <stdlib.h> int main() { printf(%d\n, rand()); printf(%d,